キュー

様々なデータタイプを格納できるキューのモジュールです(メモリが許す限りデータを格納できます)
そのままでは配列等は格納できませんが、DataContainerモジュールを変更すれば格納できます

様々なデータタイプを格納できるキューのモジュールです(メモリが許す限りデータを格納できます)
そのままでは配列等は格納できませんが、DataContainerモジュールを変更すれば格納できます

  • タグ:
  • タグはありません
//
//
#module DataContainer m_data, m_size, m_rsize
#modinit var p_data, int p_size, \
local index
if p_size < 0 {
delmod thismod
return -1
}
m_size = p_size
if m_size > 0 {
dimtype m_data, vartype(p_data), m_size
switch vartype(p_data)
case vartype("int") : m_rsize = m_size << 2 : swbreak
case vartype("str") : m_rsize = m_size : swbreak
case vartype("double") : m_rsize = m_size << 3 : swbreak
case vartype("label") : m_rsize = m_size << 2 : swbreak // TODO: 64Bit
case vartype("struct") : delmod thismod : return -1 //
default : delmod thismod : return -1 //
swend
memcpy m_data, p_data, m_rsize
} else {
dimtype m_data, vartype(p_data), 1
m_rsize = 0
}
mref index, 2
return index
//
#modfunc local GetData var p_data
if m_size > 0 {
dimtype p_data, vartype(m_data), m_size
memcpy p_data, m_data, m_rsize
} else {
dimtype p_data, vartype(m_data), 1
}
return
//
#modcfunc local GetSize
return m_size
//
#modcfunc local GetRealSize
return m_rsize
#global
//
#module Queue m_data, m_index, m_num
#modinit \
local index
dimtype m_data, vartype("struct"), 1
dim m_index, 1
dim m_num
mref index, 2
return index
//
// Enqueue@Queue [VAR], [VAR], [INT]
// 10
#modfunc local Enqueue var p_data, int p_size
newmod m_data, DataContainer, p_data, p_size
if stat < 0 : return 0
m_index(m_num) = stat
m_num++
return 1
//
// Dequeue@Queue [VAR], [VAR]
// 10
#modfunc local Dequeue var p_data
if m_num <= 0 : return 0
GetData@DataContainer m_data(m_index(0)), p_data
m_num--
memcpy m_index, m_index, m_num << 2, 0, 4
return 1
//
// RET = GetDataNum@Queue([VAR])
//
#modcfunc local GetDataNum
return m_num
//
// RET = GetNextDataSize@Queue([VAR])
// -1
#modcfunc local GetNextDataSize
if m_num <= 0 : return -1
return GetSize@DataContainer(m_data(m_index(0)))
#global
// #if 0#if 1
#if 0
newmod mod, Queue
sdim text
objsize 60, 20
pos 0, 0 : input text, 200, 20
pos 200, 0 : button "Enqueue", *enqueue
pos 260, 0 : button "Dequeue", *dequeue
pos 320, 0 : button "Count", *count
pos 380, 0 : button "Get Size", *getsize
pos 10, 30
stop
*enqueue
if text == "" {
mes "No Data Specified"
stop
}
Enqueue@Queue mod, text, strlen(text)
mes "Enqueued ["+text+"]"
objprm 0, ""
sdim text
stop
*dequeue
sdim data
Dequeue@Queue mod, data
if stat {
mes "Dequeued ["+data+"]"
} else {
mes "No Data in Queue"
}
stop
*count
mes "There are "+GetDataNum@Queue(mod)+" Data in Queue"
stop
*getsize
size = GetNextDataSize@Queue(mod)
if size >= 0 {
mes "Next Data is "+size+" Bytes Long"
} else {
mes "No Data in Queue"
}
stop
#endif
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX