/* Возможные типы контакта */
#define CONTACT_TYPE_ROOT 0
#define CONTACT_TYPE_FOLDER 1
#define CONTACT_TYPE_BUDDY 2
#define CONTACT_TYPE_META 3
#define CONTACT_TYPE_UNKNOWN 9
/* Хендл контакта используется для доступа к элементу дерева по средством функций */
typedef unsigned long CONTACT_HANDLE;
#define CONTACT_ROOT static_cast<CONTACT_HANDLE>(0)
#define CONTACT_ERROR static_cast<CONTACT_HANDLE>(-1)
#define CONTACT_DATA_TYPE_EMPTY 0
#define CONTACT_DATA_TYPE_STRING 10
#define CONTACT_DATA_TYPE_BOOL 20
#define CONTACT_DATA_TYPE_INT32 30
#define CONTACT_DATA_TYPE_INT64 31
#define CONTACT_DATA_TYPE_FLOAT 40
#define CONTACT_DATA_TYPE_DOUBLE 41
#define CONTACT_DATA_TYPE_RAW 50
/* Структура контакта - элемент дерева контактов */
typedef struct tagCONTACT_ITEM
{
CUTF8String cusNameStr; /* Имя контакта */
unsigned long nNameHash; /* Хэш имени контакта для быстрого поиска */
unsigned int nType,
nDataType;
size_t nDataSize;
void * pDataBfr;
}
CONTACT_ITEM, *PCONTACT_ITEM;
/* Структура элемента списка хэндлов выделенных классом */
typedef struct tagCONTACT_INFO
{
CONTACT_HANDLE nID; /* Уникальный идентификатор - хэндл */
TREE_NODE<CONTACT_ITEM> * pNode; /*Указатель на элемент дерева */
}
CONTACT_INFO, *PCONTACT_INFO;
//-------------------------------------------------------------------------
class CContacts
{
public:
CContacts();
virtual ~CContacts();
CONTACT_HANDLE Folder_Create(CONTACT_HANDLE _hParent, const TCHAR * _pName);
CONTACT_HANDLE Contact_Create(CONTACT_HANDLE _hFolder, TCHAR * _pName);
bool Contact_Rename(CONTACT_HANDLE _hItem, const TCHAR * _pName);
void Contact_Close (CONTACT_HANDLE _hItem); /* Close Contact Handle */
..............
..............
..............
private:
TTree<CONTACT_ITEM> cTreeContacts; /* Дерево с контактами */
TList<CONTACT_INFO> cListHandlies; /* Список хэндлов */
..............
..............
..............
};
Список контактов / Дерево
Столкнулся с такой задачкой, необходимо реализовать класс списка контактов. В классе имеется элемент который является деревом списка контактов (дерево n-мерное соответственно, реализовано в више шаблона) и есть набор функций которые должны будут управлять контактами в этом дереве - добавление, удаление, поиск.. Суть в том что этот класс должен использоваться разными потоками и реализация доступа должна быть именно через методы класса, а не через итераторы в шаблоне дерева. вот приблизительная структура того, что я сейчас надумал
Код:
Cуть моей задумки в том, что для того чтобы обеспечить быстрый доступ к элементу дерева используется хэндл который содержит указатель на элемент дерева и свой идентификатор... т.е. чтобы работать с контактом сначала необходимо получить его хендл, а затем передовать его в каждую функцию. Вот мне все кажется, что это нифига не многопоточно и не оптимально.. мутексы даже не знаю куда точно вставлять чтоб обеспечить производительность и возможность параллельной работы с деревом:) Просто т.к. дерево содержит указатель на элемент то возможно его удаление или удаление его соседа или родителя другим потоком и тогда будет видимо не хорошо.. В общем я аж прям запутался. Может кто подскажет что или какую нибудь альтернативную схему? Необходимо именно управлять используя функции и с максимальной параллельностью. Почему функции? Потому что планируется использование контакт листа другими библиотеками, плагинами например. При всем при этом еще и список контактов древовидный %)