Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Список контактов / Дерево

19K
24 апреля 2009 года
Rost
45 / / 05.07.2007
Всем привет. Постараюсь объяснить, что за проблемка :)
Столкнулся с такой задачкой, необходимо реализовать класс списка контактов. В классе имеется элемент который является деревом списка контактов (дерево n-мерное соответственно, реализовано в више шаблона) и есть набор функций которые должны будут управлять контактами в этом дереве - добавление, удаление, поиск.. Суть в том что этот класс должен использоваться разными потоками и реализация доступа должна быть именно через методы класса, а не через итераторы в шаблоне дерева. вот приблизительная структура того, что я сейчас надумал

Код:
/* Возможные типы контакта */
#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;   /* Список хэндлов */
       
                       ..............
                       ..............
                       ..............  
       
};


Cуть моей задумки в том, что для того чтобы обеспечить быстрый доступ к элементу дерева используется хэндл который содержит указатель на элемент дерева и свой идентификатор... т.е. чтобы работать с контактом сначала необходимо получить его хендл, а затем передовать его в каждую функцию. Вот мне все кажется, что это нифига не многопоточно и не оптимально.. мутексы даже не знаю куда точно вставлять чтоб обеспечить производительность и возможность параллельной работы с деревом:) Просто т.к. дерево содержит указатель на элемент то возможно его удаление или удаление его соседа или родителя другим потоком и тогда будет видимо не хорошо.. В общем я аж прям запутался. Может кто подскажет что или какую нибудь альтернативную схему? Необходимо именно управлять используя функции и с максимальной параллельностью. Почему функции? Потому что планируется использование контакт листа другими библиотеками, плагинами например. При всем при этом еще и список контактов древовидный %)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог