137 lines
3.0 KiB
C
137 lines
3.0 KiB
C
#include<stdio.h>
|
||
#include<stdlib.h>
|
||
#include<stdbool.h>
|
||
#include "array_index.h"
|
||
#include "../../common/common_user.h"
|
||
|
||
ARRAY g_user_index_head = { 0 };
|
||
ARRAY g_group_index_head = { 0 };
|
||
|
||
#define INDEX_LEN_16
|
||
|
||
#ifdef INDEX_LEN_16
|
||
#define INDEX_LEN 16
|
||
#define INDEX_LOW_MASK 0x0000ffff
|
||
#define INDEX_HI_MASK 0xffff0000
|
||
#else
|
||
#endif
|
||
|
||
|
||
#define CUR_INDEX (head->cur)
|
||
#define MAX_INDEX (head->size)
|
||
#define HI_ELEMENT_GET(element) ((element) >> INDEX_LEN)
|
||
#define HI_ELEMENT_SET(element, value) (((element) & INDEX_LOW_MASK) | ((value) << INDEX_LEN))
|
||
#define LOW_ELEMENT_GET(element) ((element) & INDEX_LOW_MASK)
|
||
#define LOW_ELEMENT_SET(element, value) (((element) & INDEX_HI_MASK) | ((value) & INDEX_LOW_MASK))
|
||
|
||
/*
|
||
*初始化索引
|
||
*失败:1
|
||
*成功:0
|
||
*/
|
||
int init_array(ARRAY* head, int index_size)
|
||
{
|
||
int i;
|
||
|
||
head->array = malloc(sizeof(head->array) * index_size);
|
||
if (NULL == head->array)
|
||
{
|
||
return 1;
|
||
}
|
||
|
||
//head->cur = 1;
|
||
//head->size = index_size;
|
||
CUR_INDEX = 1;
|
||
MAX_INDEX = index_size;
|
||
|
||
/*初始化第一个值*/
|
||
head->array[0] = HI_ELEMENT_SET(head->array[0], 0);
|
||
head->array[0] = LOW_ELEMENT_SET(head->array[0], 1);
|
||
|
||
for (i = 1; i < index_size - 1; i++)
|
||
{
|
||
head->array[i] = HI_ELEMENT_SET(head->array[i], i - 1);
|
||
head->array[i] = LOW_ELEMENT_SET(head->array[i], i + 1);
|
||
}
|
||
|
||
/*初始化最后一个值*/
|
||
head->array[i] = HI_ELEMENT_SET(head->array[i], i - 1);
|
||
head->array[i] = LOW_ELEMENT_SET(head->array[i], 0);
|
||
return 0;
|
||
}
|
||
|
||
/* 顺序分配index */
|
||
unsigned short alloc_index(ARRAY* head)
|
||
{
|
||
unsigned short index = CUR_INDEX; //获取cur
|
||
|
||
/*判断index无效,返回0*/
|
||
if ((0 == index) || ((MAX_INDEX - 1) <= index))
|
||
{
|
||
return INVALID_INDEX;
|
||
}
|
||
|
||
CUR_INDEX = LOW_ELEMENT_GET(head->array[index]); //移动cur
|
||
head->array[index] = 0; //被使用过的元素置0
|
||
return index; //返回被使用的下标作为ID
|
||
|
||
//if ((0 < index) || ((MAX_INDEX-1) > index))
|
||
|
||
}
|
||
|
||
/* 指定分配index
|
||
*成功返回:index
|
||
*失败返回:0
|
||
*/
|
||
unsigned short alloc_index_special(ARRAY* head, unsigned short index)
|
||
{
|
||
unsigned short hi_index, low_index;
|
||
|
||
/*判断index无效,返回0*/
|
||
if ((0 == index) || ((MAX_INDEX - 1) <= index))
|
||
{
|
||
return INVALID_INDEX;
|
||
}
|
||
|
||
/* 判断已经被使用过了,返回0 */
|
||
if (INVALID_INDEX == head->array[index])
|
||
{
|
||
return INVALID_INDEX;
|
||
}
|
||
|
||
/* 判断和顺序插入相同 */
|
||
if (CUR_INDEX == index)
|
||
{
|
||
return alloc_index(head);
|
||
}
|
||
|
||
low_index = LOW_ELEMENT_GET(head->array[index]);
|
||
hi_index = HI_ELEMENT_GET(head->array[index]);
|
||
|
||
head->array[low_index] = HI_ELEMENT_SET(head->array[low_index], hi_index);
|
||
head->array[hi_index] = LOW_ELEMENT_SET(head->array[hi_index], low_index);
|
||
head->array[index] = 0;
|
||
return index;
|
||
}
|
||
|
||
void free_index(ARRAY* head, unsigned short index)
|
||
{
|
||
unsigned short cur_index = CUR_INDEX;
|
||
|
||
if ((0 == index) || ((MAX_INDEX - 1) <= index))
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (INVALID_INDEX != head->array[index])
|
||
{
|
||
return;
|
||
}
|
||
|
||
CUR_INDEX = index;
|
||
head->array[index] = LOW_ELEMENT_SET(head->array[index], cur_index);
|
||
head->array[cur_index] = HI_ELEMENT_SET(head->array[cur_index], index);
|
||
return;
|
||
}
|
||
|