📄 c_shm_merge.cpp
字号:
while( i_item_seq < MAX_ITEM_COUNT )
{
if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->record_count )
{
i_sort_seq = 1;
return &(p_merge_item[i_item_seq]->p_merge_list[i_element_seq]);
}
if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->add_record_count )
{
i_sort_seq = 0;
return &(p_merge_item[i_item_seq]->p_add_merge_list[i_element_seq]);
}
i_item_seq ++;
}
return NULL;
//return getElementBySeq(i_item_seq, i_element_seq, i_sort_seq );
}
SHM_MERGE_LIST* c_shm_merge::getNextElement()
{
i_element_seq ++;
if( 1 == i_sort_seq )
{
//有序区是否已经找完,是,到无序区找。
if( i_element_seq >= p_merge_item[i_item_seq]->p_merge_info->record_count )
{
i_sort_seq = 0;
i_element_seq = 0;
}
}
else
{
//无序区是否找完,是,到下一个子块中找
if( i_element_seq >= p_merge_item[i_item_seq]->p_merge_info->add_record_count )
{
i_sort_seq = 1;
i_element_seq = 0;
i_item_seq ++;
while( i_item_seq < MAX_ITEM_COUNT )
{
if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->record_count )
{
i_sort_seq = 1;
return &(p_merge_item[i_item_seq]->p_merge_list[i_element_seq]);
}
if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->add_record_count )
{
i_sort_seq = 0;
return &(p_merge_item[i_item_seq]->p_add_merge_list[i_element_seq]);
}
i_item_seq ++;
}
}
}
//是否已到最大块?
if( i_item_seq >= MAX_ITEM_COUNT )
{
return NULL;
}
else
{
//返回值
if( 1 == i_sort_seq )
return &(p_merge_item[i_item_seq]->p_merge_list[i_element_seq]);
else
return &(p_merge_item[i_item_seq]->p_add_merge_list[i_element_seq]);
}
}
bool c_shm_merge::getChargeList1(const long serv_id, const int billing_cycle_id )
{
//构造main
char tmp_buf[20];
memcpy( &tmp_buf[0], &serv_id, 8 );
memcpy( &tmp_buf[8], &billing_cycle_id, 4 );
//首先确定是在哪一块中
int main_seq = getMergeItemSeq(&tmp_buf[0]);
//在小块中查找
SHM_MERGE_LIST* p_find_main = p_merge_item[main_seq]->find(&tmp_buf[0]);
if( p_find_main != NULL )
{
//找到号码
get_next_pos = p_find_main ->item_pos;
p_list = getNext();
list_get_item_count = -1;
return true;
}
else
{
return false;
}
}
int c_shm_merge::getChargeList(const int serv_id, const int counting_type_id)
{
//首先确定是在哪一块中
int main_seq = (serv_id%100)/10;
//在小块中查找
SHM_MERGE_LIST* p_find_main = p_merge_item[main_seq]->findServID( serv_id, counting_type_id );
p_find_charge_main = p_find_main ;
if( p_find_main != NULL )
{
//找到号码
//return update( p_find_main->item_pos, p_item, p_fee );
get_next_pos = p_find_main->item_pos;
return 0;
}
else
{
//打不到
get_next_pos = -1;
return -1;
}
}
void c_shm_merge::displayMain()
{
/*
char main_value[500];
int int_value;
long long_value;
double double_value;
if( p_find_charge_main != NULL )
{
for ( int i = 0 ; i < g_main_key.size() ; i ++)
{
memcpy(&main_value[0], &(p_find_charge_main->main[g_main_key[i].pos]), g_main_key[i].size);
main_value[g_main_key[i].size] = '\0';
switch ( g_main_key[i].type )
{
catch 1:
cout<<i<<"field:"<<main_value<<endl;
break;
catch 2:
memcpy( &int_value, &main_value[0], 4 );
cout<<i<<"field:"<<int_value<<endl;
break;
catch 3:
cout<<i<<"field:"<<main_value<<endl;
break;
catch 4:
memcpy( &double_value, &main_value[0], 8 );
cout<<i<<"field:"<<double_value<<endl;
break;
catch 5:
memcpy( &long_value, &main_value[0], 12 );
cout<<i<<"field:"<<long_value<<endl;
break;
default:
cout<<i<<"field:"<<main_value<<endl;
break;
}
}
}
*/
return;
}
//冒泡法排序,只对8个进行排序
int c_shm_merge_addition::qSort(const int begin_pos)
{
return 0;
}
int c_shm_merge_addition::getPos(const int get_pos)
{
return p_merge_list_item[get_pos].next_pos;
}
long c_shm_merge_addition::getFee( const int main_pos, const int item )
{
int j, last_pos, get_comp_pos;
int last_main_pos = main_pos;
int t;
if( p_merge_list_item[last_main_pos].next_pos == -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
return p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee;
}
else if( t < 0 )
{
return -999999;
}
else
{
//在本块中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
return p_merge_list_item[ last_main_pos ].acctFee[ j ].fee;
else if( t > 0 )
return -999999;
}
}
}
while( p_merge_list_item[last_main_pos].next_pos != -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
return p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee;
}
else if( t < 0 )
{
last_main_pos = p_merge_list_item[last_main_pos].next_pos;
}
else
{
//在本块中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
return p_merge_list_item[ last_main_pos ].acctFee[ j ].fee;
else if( t > 0 )
return -999999;
}
}
}
return -999999;
}
bool c_shm_merge_addition::getFee( int main_pos, const int item, long* out_value )
{
int j, last_pos, get_comp_pos;
int last_main_pos = main_pos;
int t;
if( p_merge_list_item[last_main_pos].next_pos == -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), sizeof(long) );
return true;
}
else if( t < 0 )
{
return false;
}
else
{
//在本块中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
{
memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), sizeof(long) );
return true;
}
else if( t > 0 )
return false;
}
}
}
while( p_merge_list_item[last_main_pos].next_pos != -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), sizeof(long) );
return true;
}
else if( t < 0 )
{
last_main_pos = p_merge_list_item[last_main_pos].next_pos;
}
else
{
//在本块中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
{
memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), sizeof(long) );
return true;
}
else if( t > 0 )
return false;
}
}
}
return false;
}
bool c_shm_merge_addition::updateFee( const int main_pos, const int item, const long fee )
{
int j, last_pos, get_comp_pos;
int last_main_pos = main_pos;
int t;
if( p_merge_list_item[last_main_pos].next_pos == -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), &fee, sizeof(long) );
return true;
//p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee = fee;
}
else if( t < 0 )
{
append( main_pos, &item, &fee );
return true;
}
else
{
//在本块中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
{
memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), &fee, sizeof(long) );
//long test_long ;
//memcpy( &test_long, &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), sizeof(long) );
//int tmp_d;
//char tmp_char[17];
//memcpy( &tmp_char[0], &(p_merge_list_item[ last_main_pos ].acctFee[ j ].key), 16 );
//for( tmp_d = 0 ; tmp_d < 16; tmp_d ++ )
// printf( "%d\t", tmp_char[tmp_d] );
//printf("\n");fflush(stdout);
return true;
//p_merge_list_item[ last_main_pos ].acctFee[ j ].fee = fee;
}
else if( t > 0 )
{
append( main_pos, &item, &fee );
return true;
}
}
}
}
while( p_merge_list_item[last_main_pos].next_pos != -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), &fee, sizeof(long) );
return true;
//p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee = fee;
}
else if( t < 0 )
{
last_main_pos = p_merge_list_item[last_main_pos].next_pos;
}
else
{
//在本块中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
{
memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), &fee, sizeof(long) );
return true;
//p_merge_list_item[ last_main_pos ].acctFee[ j ].fee = fee;
}
else if( t > 0 )
{
append( main_pos, &item, &fee );
return true;
}
}
}
}
return true;
}
/*
SHM_MERGE_LIST_ITEM* c_shm_merge_addition::binfind( const int begin_pos, const int end_pos, const SHM_MERGE_LIST_ITEM* item )
{
if( begin_pos == end_pos )
{
if( listItemComp(&(p_merge_list_item[begin_pos]), item ) == 0 )
{
return &(p_merge_list_item[begin_pos]);
}
else
{
return NULL;
}
}
else
{
int middle_pos = begin_pos + (end_pos-begin_pos)/2;
int comp = listItemComp(&(p_merge_list_item[middle_pos]), item );
if( comp == 0 )
{
return &(p_merge_list_item[middle_pos]);
}
else if( comp > 0 )
{
return binfind( begin_pos, middle_pos, item );
}
else
{
return binfind( middle_pos+1, end_pos, item );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -