⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mystringset.c

📁 提供了rbtree ttree avltree list hashtable等常用容器的算法,代码经过uclinux + arm44b0平台验证
💻 C
字号:
/*
*
*MyStringSet.c from boost 字符串查找集合字符串查找集合-只需要"一次"字符串比较即可完成从无限个数的字符串集合里提取所需的字符串 lin shao chuan
*
*/


#include "MyStringSet.h"
#include <assert.h>
#include "mymap.h"
#include "myutility.h"


#define INVAL_DATA ((void *)-1)

typedef struct __mystringset_data_t_
{
	 HMYMAP hmap;
	 void * data;
}mystringset_data_t;

typedef struct __mystringset_t_
{
	 HMYMAP hmap;
	 HMYMEMPOOL hm;
}mystringset_t;


/*
*
*1 表示 key1 比 key2 大
*0 表示 key1 比 key2 小 
*
*/
static __INLINE__ int mystring_set_compare(const void * key1, const void * key2)
{
	return (char)key1 - (char)key2;
}

static __INLINE__ void data_destruct(void * data, size_t data_size)
{
	mystringset_data_t * dt = (mystringset_data_t *)data;
	assert(data_size == sizeof(*dt));

	if(dt->hmap)
		MyMapDestruct(dt->hmap);
}

static myobj_ops data_ops = {NULL, data_destruct, NULL};


/*
*
*创建字符串集合
*
*/
HMYSTRING_SET MyStringSetConstruct(HMYMEMPOOL hm)
{
	mystringset_t * ss = MyMemPoolMalloc(hm, sizeof(*ss));
	if(NULL == ss)
		return NULL;

	ss->hm = hm;

	ss->hmap = MyMapRealConstruct(hm, mystring_set_compare, NULL, &data_ops);

	return (HMYSTRING_SET)ss;
}

/*
*
*创建字符串集合
*
*/
extern void MyStringSetDestruct(HMYSTRING_SET hss);

/*
*
*创建字符串集合
*
*/
int MyStringSetAdd(HMYSTRING_SET hss, char * first, const char * last, const void * data, size_t data_size)
{
	HMYMAP current = NULL;

	mystringset_t * ss = (mystringset_t *)hss;
	if(NULL == ss || NULL == ss->hmap || last == first || NULL == first || NULL == last)
		return -1;

	MY_UNUSED_ARG(data_size);

	current = ss->hmap;

	for(;current;)
	{
		mystringset_data_t * t = NULL;

		HMYMAP_ITER it =
			MyMapSearch(current, (void *)(*first));

		if(it)
		{
			first ++;

			t = MyMapGetIterData(it, NULL);

			assert(t && t->hmap);

			current = t->hmap;

			if(last != first)
				continue;

			if(INVAL_DATA != t->data)
				return -1;

			t->data = (void *)data;
			return 0;
		}
		else
		{
			mystringset_data_t t = {NULL, INVAL_DATA};

			t.hmap = MyMapRealConstruct(ss->hm, mystring_set_compare, NULL, &data_ops);
			if(last == first)
				t.data = (void *)data;

			MyMapInsertUnique(current, (void *)(*first), 0, (void *)&t, sizeof(t));

			if(last == first)
				return 0;

			first ++;

			current = t.hmap;
		}
	}

	return -1;
}

/*
*
*删除字符串集合
*
*/
/*int MyStringSetDel(HMYSTRING_SET hss, char * first, const char * last, void ** data, size_t * data_size)
{
	//删除需要记录"父节点"
	return -1;
}*/

/*
*
*查找字符串集合
*
*/
int MyStringSetSearch(HMYSTRING_SET hss, char * first, const char * last, void ** data, size_t * data_size)
{
	HMYMAP current = NULL;

	mystringset_t * ss = (mystringset_t *)hss;
	if(NULL == ss || NULL == ss->hmap)
		return -1;

	MY_UNUSED_ARG(data_size);

	current = ss->hmap;

	for(;current;)
	{
		mystringset_data_t * t = NULL;
		//HMYMAP hmap = NULL;

		HMYMAP_ITER it =
			MyMapSearch(current, (void *)(*first));

		first ++;

		if(NULL == it)
			return -1;

		//ckey = (char)MyMapGetIterKey(it);

		t = MyMapGetIterData(it, NULL);

		assert(t && t->hmap);

		current = t->hmap;

		if(last >= first)
			continue;

		if(INVAL_DATA == t->data)
			return -1;

		if(data)
			*data = t->data;

		return 0;
	}

	return -1;
}
















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -