Blame winpr/include/winpr/collections.h

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Collections
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifndef WINPR_COLLECTIONS_H
Packit 1fb8d4
#define WINPR_COLLECTIONS_H
Packit 1fb8d4
Packit 1fb8d4
#include <stdio.h>
Packit 1fb8d4
#include <stdlib.h>
Packit 1fb8d4
#include <string.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/winpr.h>
Packit 1fb8d4
#include <winpr/wtypes.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/synch.h>
Packit 1fb8d4
#include <winpr/stream.h>
Packit 1fb8d4
Packit 1fb8d4
#ifdef __cplusplus
Packit 1fb8d4
extern "C" {
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
typedef void* (*OBJECT_NEW_FN)(void* val);
Packit 1fb8d4
typedef void (*OBJECT_INIT_FN)(void* obj);
Packit 1fb8d4
typedef void (*OBJECT_UNINIT_FN)(void* obj);
Packit 1fb8d4
typedef void (*OBJECT_FREE_FN)(void* obj);
Packit 1fb8d4
typedef BOOL (*OBJECT_EQUALS_FN)(const void* objA, const void* objB);
Packit 1fb8d4
Packit 1fb8d4
struct _wObject
Packit 1fb8d4
{
Packit 1fb8d4
	OBJECT_NEW_FN fnObjectNew;
Packit 1fb8d4
	OBJECT_INIT_FN fnObjectInit;
Packit 1fb8d4
	OBJECT_UNINIT_FN fnObjectUninit;
Packit 1fb8d4
	OBJECT_FREE_FN fnObjectFree;
Packit 1fb8d4
	OBJECT_EQUALS_FN fnObjectEquals;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wObject wObject;
Packit 1fb8d4
Packit 1fb8d4
/* System.Collections.Queue */
Packit 1fb8d4
Packit 1fb8d4
struct _wQueue
Packit 1fb8d4
{
Packit 1fb8d4
	int capacity;
Packit 1fb8d4
	int growthFactor;
Packit 1fb8d4
	BOOL synchronized;
Packit 1fb8d4
Packit 1fb8d4
	int head;
Packit 1fb8d4
	int tail;
Packit 1fb8d4
	int size;
Packit 1fb8d4
	void** array;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
	HANDLE event;
Packit 1fb8d4
Packit 1fb8d4
	wObject object;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wQueue wQueue;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int Queue_Count(wQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void Queue_Lock(wQueue* queue);
Packit 1fb8d4
WINPR_API void Queue_Unlock(wQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API HANDLE Queue_Event(wQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
#define Queue_Object(_queue)	(&_queue->object)
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void Queue_Clear(wQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL Queue_Contains(wQueue* queue, void* obj);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL Queue_Enqueue(wQueue* queue, void* obj);
Packit 1fb8d4
WINPR_API void* Queue_Dequeue(wQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void* Queue_Peek(wQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wQueue* Queue_New(BOOL synchronized, int capacity, int growthFactor);
Packit 1fb8d4
WINPR_API void Queue_Free(wQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
/* System.Collections.Stack */
Packit 1fb8d4
Packit 1fb8d4
struct _wStack
Packit 1fb8d4
{
Packit 1fb8d4
	int size;
Packit 1fb8d4
	int capacity;
Packit 1fb8d4
	void** array;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
	BOOL synchronized;
Packit 1fb8d4
	wObject object;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wStack wStack;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int Stack_Count(wStack* stack);
Packit 1fb8d4
WINPR_API BOOL Stack_IsSynchronized(wStack* stack);
Packit 1fb8d4
Packit 1fb8d4
#define Stack_Object(_stack)	(&_stack->object)
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void Stack_Clear(wStack* stack);
Packit 1fb8d4
WINPR_API BOOL Stack_Contains(wStack* stack, void* obj);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void Stack_Push(wStack* stack, void* obj);
Packit 1fb8d4
WINPR_API void* Stack_Pop(wStack* stack);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void* Stack_Peek(wStack* stack);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wStack* Stack_New(BOOL synchronized);
Packit 1fb8d4
WINPR_API void Stack_Free(wStack* stack);
Packit 1fb8d4
Packit 1fb8d4
/* System.Collections.ArrayList */
Packit 1fb8d4
Packit 1fb8d4
struct _wArrayList
Packit 1fb8d4
{
Packit 1fb8d4
	int capacity;
Packit 1fb8d4
	int growthFactor;
Packit 1fb8d4
	BOOL synchronized;
Packit 1fb8d4
Packit 1fb8d4
	int size;
Packit 1fb8d4
	void** array;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
Packit 1fb8d4
	wObject object;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wArrayList wArrayList;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int ArrayList_Capacity(wArrayList* arrayList);
Packit 1fb8d4
WINPR_API int ArrayList_Count(wArrayList* arrayList);
Packit 1fb8d4
WINPR_API int ArrayList_Items(wArrayList* arrayList, ULONG_PTR** ppItems);
Packit 1fb8d4
WINPR_API BOOL ArrayList_IsFixedSized(wArrayList* arrayList);
Packit 1fb8d4
WINPR_API BOOL ArrayList_IsReadOnly(wArrayList* arrayList);
Packit 1fb8d4
WINPR_API BOOL ArrayList_IsSynchronized(wArrayList* arrayList);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void ArrayList_Lock(wArrayList* arrayList);
Packit 1fb8d4
WINPR_API void ArrayList_Unlock(wArrayList* arrayList);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void* ArrayList_GetItem(wArrayList* arrayList, int index);
Packit 1fb8d4
WINPR_API void ArrayList_SetItem(wArrayList* arrayList, int index, void* obj);
Packit 1fb8d4
Packit 1fb8d4
#define ArrayList_Object(_arrayList)	(&_arrayList->object)
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void ArrayList_Clear(wArrayList* arrayList);
Packit 1fb8d4
WINPR_API BOOL ArrayList_Contains(wArrayList* arrayList, void* obj);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int ArrayList_Add(wArrayList* arrayList, void* obj);
Packit 1fb8d4
WINPR_API BOOL ArrayList_Insert(wArrayList* arrayList, int index, void* obj);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL ArrayList_Remove(wArrayList* arrayList, void* obj);
Packit 1fb8d4
WINPR_API BOOL ArrayList_RemoveAt(wArrayList* arrayList, int index);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int ArrayList_IndexOf(wArrayList* arrayList, void* obj, int startIndex, int count);
Packit 1fb8d4
WINPR_API int ArrayList_LastIndexOf(wArrayList* arrayList, void* obj, int startIndex, int count);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wArrayList* ArrayList_New(BOOL synchronized);
Packit 1fb8d4
WINPR_API void ArrayList_Free(wArrayList* arrayList);
Packit 1fb8d4
Packit 1fb8d4
/* System.Collections.DictionaryBase */
Packit 1fb8d4
Packit 1fb8d4
struct _wDictionary
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL synchronized;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wDictionary wDictionary;
Packit 1fb8d4
Packit 1fb8d4
/* System.Collections.Specialized.ListDictionary */
Packit 1fb8d4
Packit 1fb8d4
typedef struct _wListDictionaryItem wListDictionaryItem;
Packit 1fb8d4
Packit 1fb8d4
struct _wListDictionaryItem
Packit 1fb8d4
{
Packit 1fb8d4
	void* key;
Packit 1fb8d4
	void* value;
Packit 1fb8d4
Packit 1fb8d4
	wListDictionaryItem* next;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
struct _wListDictionary
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL synchronized;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
Packit 1fb8d4
	wListDictionaryItem* head;
Packit 1fb8d4
	wObject objectKey;
Packit 1fb8d4
	wObject objectValue;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wListDictionary wListDictionary;
Packit 1fb8d4
Packit 1fb8d4
#define ListDictionary_KeyObject(_dictionary)	(&_dictionary->objectKey)
Packit 1fb8d4
#define ListDictionary_ValueObject(_dictionary)	(&_dictionary->objectValue)
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int ListDictionary_Count(wListDictionary* listDictionary);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void ListDictionary_Lock(wListDictionary* listDictionary);
Packit 1fb8d4
WINPR_API void ListDictionary_Unlock(wListDictionary* listDictionary);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL ListDictionary_Add(wListDictionary* listDictionary, const void* key, void* value);
Packit 1fb8d4
WINPR_API void* ListDictionary_Remove(wListDictionary* listDictionary, const void* key);
Packit 1fb8d4
WINPR_API void* ListDictionary_Remove_Head(wListDictionary* listDictionary);
Packit 1fb8d4
WINPR_API void ListDictionary_Clear(wListDictionary* listDictionary);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL ListDictionary_Contains(wListDictionary* listDictionary, const void* key);
Packit 1fb8d4
WINPR_API int ListDictionary_GetKeys(wListDictionary* listDictionary, ULONG_PTR** ppKeys);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void* ListDictionary_GetItemValue(wListDictionary* listDictionary, const void* key);
Packit 1fb8d4
WINPR_API BOOL ListDictionary_SetItemValue(wListDictionary* listDictionary, const void* key,
Packit 1fb8d4
        void* value);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wListDictionary* ListDictionary_New(BOOL synchronized);
Packit 1fb8d4
WINPR_API void ListDictionary_Free(wListDictionary* listDictionary);
Packit 1fb8d4
Packit 1fb8d4
/* System.Collections.Generic.LinkedList<T> */
Packit 1fb8d4
Packit 1fb8d4
typedef struct _wLinkedList wLinkedList;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int LinkedList_Count(wLinkedList* list);
Packit 1fb8d4
WINPR_API void* LinkedList_First(wLinkedList* list);
Packit 1fb8d4
WINPR_API void* LinkedList_Last(wLinkedList* list);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL LinkedList_Contains(wLinkedList* list, void* value);
Packit 1fb8d4
WINPR_API void LinkedList_Clear(wLinkedList* list);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL LinkedList_AddFirst(wLinkedList* list, void* value);
Packit 1fb8d4
WINPR_API BOOL LinkedList_AddLast(wLinkedList* list, void* value);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL LinkedList_Remove(wLinkedList* list, void* value);
Packit 1fb8d4
WINPR_API void LinkedList_RemoveFirst(wLinkedList* list);
Packit 1fb8d4
WINPR_API void LinkedList_RemoveLast(wLinkedList* list);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void LinkedList_Enumerator_Reset(wLinkedList* list);
Packit 1fb8d4
WINPR_API void* LinkedList_Enumerator_Current(wLinkedList* list);
Packit 1fb8d4
WINPR_API BOOL LinkedList_Enumerator_MoveNext(wLinkedList* list);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wLinkedList* LinkedList_New(void);
Packit 1fb8d4
WINPR_API void LinkedList_Free(wLinkedList* list);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wObject* LinkedList_Object(wLinkedList* list);
Packit 1fb8d4
Packit 1fb8d4
/* System.Collections.Generic.KeyValuePair<TKey,TValue> */
Packit 1fb8d4
Packit 1fb8d4
typedef struct _wKeyValuePair wKeyValuePair;
Packit 1fb8d4
Packit 1fb8d4
struct _wKeyValuePair
Packit 1fb8d4
{
Packit 1fb8d4
	void* key;
Packit 1fb8d4
	void* value;
Packit 1fb8d4
Packit 1fb8d4
	wKeyValuePair* next;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
/* Reference Table */
Packit 1fb8d4
Packit 1fb8d4
struct _wReference
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 Count;
Packit 1fb8d4
	void* Pointer;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wReference wReference;
Packit 1fb8d4
Packit 1fb8d4
typedef int (*REFERENCE_FREE)(void* context, void* ptr);
Packit 1fb8d4
Packit 1fb8d4
struct _wReferenceTable
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 size;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
	void* context;
Packit 1fb8d4
	BOOL synchronized;
Packit 1fb8d4
	wReference* array;
Packit 1fb8d4
	REFERENCE_FREE ReferenceFree;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wReferenceTable wReferenceTable;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API UINT32 ReferenceTable_Add(wReferenceTable* referenceTable, void* ptr);
Packit 1fb8d4
WINPR_API UINT32 ReferenceTable_Release(wReferenceTable* referenceTable, void* ptr);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wReferenceTable* ReferenceTable_New(BOOL synchronized, void* context,
Packit 1fb8d4
        REFERENCE_FREE ReferenceFree);
Packit 1fb8d4
WINPR_API void ReferenceTable_Free(wReferenceTable* referenceTable);
Packit 1fb8d4
Packit 1fb8d4
/* Countdown Event */
Packit 1fb8d4
Packit 1fb8d4
struct _wCountdownEvent
Packit 1fb8d4
{
Packit 1fb8d4
	DWORD count;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
	HANDLE event;
Packit 1fb8d4
	DWORD initialCount;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wCountdownEvent wCountdownEvent;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API DWORD CountdownEvent_CurrentCount(wCountdownEvent* countdown);
Packit 1fb8d4
WINPR_API DWORD CountdownEvent_InitialCount(wCountdownEvent* countdown);
Packit 1fb8d4
WINPR_API BOOL CountdownEvent_IsSet(wCountdownEvent* countdown);
Packit 1fb8d4
WINPR_API HANDLE CountdownEvent_WaitHandle(wCountdownEvent* countdown);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void CountdownEvent_AddCount(wCountdownEvent* countdown, DWORD signalCount);
Packit 1fb8d4
WINPR_API BOOL CountdownEvent_Signal(wCountdownEvent* countdown, DWORD signalCount);
Packit 1fb8d4
WINPR_API void CountdownEvent_Reset(wCountdownEvent* countdown, DWORD count);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wCountdownEvent* CountdownEvent_New(DWORD initialCount);
Packit 1fb8d4
WINPR_API void CountdownEvent_Free(wCountdownEvent* countdown);
Packit 1fb8d4
Packit 1fb8d4
/* Hash Table */
Packit 1fb8d4
Packit 1fb8d4
typedef UINT32(*HASH_TABLE_HASH_FN)(void* key);
Packit 1fb8d4
typedef BOOL (*HASH_TABLE_KEY_COMPARE_FN)(void* key1, void* key2);
Packit 1fb8d4
typedef BOOL (*HASH_TABLE_VALUE_COMPARE_FN)(void* value1, void* value2);
Packit 1fb8d4
typedef void* (*HASH_TABLE_KEY_CLONE_FN)(void* key);
Packit 1fb8d4
typedef void* (*HASH_TABLE_VALUE_CLONE_FN)(void* value);
Packit 1fb8d4
typedef void (*HASH_TABLE_KEY_FREE_FN)(void* key);
Packit 1fb8d4
typedef void (*HASH_TABLE_VALUE_FREE_FN)(void* value);
Packit 1fb8d4
Packit 1fb8d4
struct _wHashTable
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL synchronized;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
Packit 1fb8d4
	int numOfBuckets;
Packit 1fb8d4
	int numOfElements;
Packit 1fb8d4
	float idealRatio;
Packit 1fb8d4
	float lowerRehashThreshold;
Packit 1fb8d4
	float upperRehashThreshold;
Packit 1fb8d4
	wKeyValuePair** bucketArray;
Packit 1fb8d4
Packit 1fb8d4
	HASH_TABLE_HASH_FN hash;
Packit 1fb8d4
	HASH_TABLE_KEY_COMPARE_FN keyCompare;
Packit 1fb8d4
	HASH_TABLE_VALUE_COMPARE_FN valueCompare;
Packit 1fb8d4
	HASH_TABLE_KEY_CLONE_FN keyClone;
Packit 1fb8d4
	HASH_TABLE_VALUE_CLONE_FN valueClone;
Packit 1fb8d4
	HASH_TABLE_KEY_FREE_FN keyFree;
Packit 1fb8d4
	HASH_TABLE_VALUE_FREE_FN valueFree;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wHashTable wHashTable;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int HashTable_Count(wHashTable* table);
Packit 1fb8d4
WINPR_API int HashTable_Add(wHashTable* table, void* key, void* value);
Packit 1fb8d4
WINPR_API BOOL HashTable_Remove(wHashTable* table, void* key);
Packit 1fb8d4
WINPR_API void HashTable_Clear(wHashTable* table);
Packit 1fb8d4
WINPR_API BOOL HashTable_Contains(wHashTable* table, void* key);
Packit 1fb8d4
WINPR_API BOOL HashTable_ContainsKey(wHashTable* table, void* key);
Packit 1fb8d4
WINPR_API BOOL HashTable_ContainsValue(wHashTable* table, void* value);
Packit 1fb8d4
WINPR_API void* HashTable_GetItemValue(wHashTable* table, void* key);
Packit 1fb8d4
WINPR_API BOOL HashTable_SetItemValue(wHashTable* table, void* key, void* value);
Packit 1fb8d4
WINPR_API int HashTable_GetKeys(wHashTable* table, ULONG_PTR** ppKeys);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API UINT32 HashTable_PointerHash(void* pointer);
Packit 1fb8d4
WINPR_API BOOL HashTable_PointerCompare(void* pointer1, void* pointer2);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API UINT32 HashTable_StringHash(void* key);
Packit 1fb8d4
WINPR_API BOOL HashTable_StringCompare(void* string1, void* string2);
Packit 1fb8d4
WINPR_API void* HashTable_StringClone(void* str);
Packit 1fb8d4
WINPR_API void HashTable_StringFree(void* str);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wHashTable* HashTable_New(BOOL synchronized);
Packit 1fb8d4
WINPR_API void HashTable_Free(wHashTable* table);
Packit 1fb8d4
Packit 1fb8d4
/* BufferPool */
Packit 1fb8d4
Packit 1fb8d4
struct _wBufferPoolItem
Packit 1fb8d4
{
Packit 1fb8d4
	int size;
Packit 1fb8d4
	void* buffer;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wBufferPoolItem wBufferPoolItem;
Packit 1fb8d4
Packit 1fb8d4
struct _wBufferPool
Packit 1fb8d4
{
Packit 1fb8d4
	int fixedSize;
Packit 1fb8d4
	DWORD alignment;
Packit 1fb8d4
	BOOL synchronized;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
Packit 1fb8d4
	int size;
Packit 1fb8d4
	int capacity;
Packit 1fb8d4
	void** array;
Packit 1fb8d4
Packit 1fb8d4
	int aSize;
Packit 1fb8d4
	int aCapacity;
Packit 1fb8d4
	wBufferPoolItem* aArray;
Packit 1fb8d4
Packit 1fb8d4
	int uSize;
Packit 1fb8d4
	int uCapacity;
Packit 1fb8d4
	wBufferPoolItem* uArray;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wBufferPool wBufferPool;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int BufferPool_GetPoolSize(wBufferPool* pool);
Packit 1fb8d4
WINPR_API int BufferPool_GetBufferSize(wBufferPool* pool, void* buffer);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void* BufferPool_Take(wBufferPool* pool, int bufferSize);
Packit 1fb8d4
WINPR_API BOOL BufferPool_Return(wBufferPool* pool, void* buffer);
Packit 1fb8d4
WINPR_API void BufferPool_Clear(wBufferPool* pool);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wBufferPool* BufferPool_New(BOOL synchronized, int fixedSize, DWORD alignment);
Packit 1fb8d4
WINPR_API void BufferPool_Free(wBufferPool* pool);
Packit 1fb8d4
Packit 1fb8d4
/* ObjectPool */
Packit 1fb8d4
Packit 1fb8d4
struct _wObjectPool
Packit 1fb8d4
{
Packit 1fb8d4
	int size;
Packit 1fb8d4
	int capacity;
Packit 1fb8d4
	void** array;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
	wObject object;
Packit 1fb8d4
	BOOL synchronized;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wObjectPool wObjectPool;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void* ObjectPool_Take(wObjectPool* pool);
Packit 1fb8d4
WINPR_API void ObjectPool_Return(wObjectPool* pool, void* obj);
Packit 1fb8d4
WINPR_API void ObjectPool_Clear(wObjectPool* pool);
Packit 1fb8d4
Packit 1fb8d4
#define ObjectPool_Object(_pool)	(&_pool->object)
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wObjectPool* ObjectPool_New(BOOL synchronized);
Packit 1fb8d4
WINPR_API void ObjectPool_Free(wObjectPool* pool);
Packit 1fb8d4
Packit 1fb8d4
/* Message Queue */
Packit 1fb8d4
Packit 1fb8d4
typedef struct _wMessage wMessage;
Packit 1fb8d4
Packit 1fb8d4
typedef void (*MESSAGE_FREE_FN)(wMessage* message);
Packit 1fb8d4
Packit 1fb8d4
struct _wMessage
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 id;
Packit 1fb8d4
	void* context;
Packit 1fb8d4
	void* wParam;
Packit 1fb8d4
	void* lParam;
Packit 1fb8d4
	UINT64 time;
Packit 1fb8d4
	MESSAGE_FREE_FN Free;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
struct _wMessageQueue
Packit 1fb8d4
{
Packit 1fb8d4
	int head;
Packit 1fb8d4
	int tail;
Packit 1fb8d4
	int size;
Packit 1fb8d4
	int capacity;
Packit 1fb8d4
	wMessage* array;
Packit 1fb8d4
	CRITICAL_SECTION lock;
Packit 1fb8d4
	HANDLE event;
Packit 1fb8d4
Packit 1fb8d4
	wObject object;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wMessageQueue wMessageQueue;
Packit 1fb8d4
Packit 1fb8d4
#define WMQ_QUIT	0xFFFFFFFF
Packit 1fb8d4
Packit 1fb8d4
WINPR_API HANDLE MessageQueue_Event(wMessageQueue* queue);
Packit 1fb8d4
WINPR_API BOOL MessageQueue_Wait(wMessageQueue* queue);
Packit 1fb8d4
WINPR_API int MessageQueue_Size(wMessageQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API BOOL MessageQueue_Dispatch(wMessageQueue* queue, wMessage* message);
Packit 1fb8d4
WINPR_API BOOL MessageQueue_Post(wMessageQueue* queue, void* context, UINT32 type, void* wParam,
Packit 1fb8d4
                                 void* lParam);
Packit 1fb8d4
WINPR_API BOOL MessageQueue_PostQuit(wMessageQueue* queue, int nExitCode);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API int MessageQueue_Get(wMessageQueue* queue, wMessage* message);
Packit 1fb8d4
WINPR_API int MessageQueue_Peek(wMessageQueue* queue, wMessage* message, BOOL remove);
Packit 1fb8d4
Packit 1fb8d4
/*! \brief Clears all elements in a message queue.
Packit 1fb8d4
 *
Packit 1fb8d4
 *  \note If dynamically allocated data is part of the messages,
Packit 1fb8d4
 *        a custom cleanup handler must be passed in the 'callback'
Packit 1fb8d4
 *        argument for MessageQueue_New.
Packit 1fb8d4
 *
Packit 1fb8d4
 *  \param queue The queue to clear.
Packit 1fb8d4
 *
Packit 1fb8d4
 *  \return 0 in case of success or a error code otherwise.
Packit 1fb8d4
 */
Packit 1fb8d4
WINPR_API int MessageQueue_Clear(wMessageQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
/*! \brief Creates a new message queue.
Packit 1fb8d4
 * 				 If 'callback' is null, no custom cleanup will be done
Packit 1fb8d4
 * 				 on message queue deallocation.
Packit 1fb8d4
 * 				 If the 'callback' argument contains valid uninit or
Packit 1fb8d4
 * 				 free functions those will be called by
Packit 1fb8d4
 * 				 'MessageQueue_Clear'.
Packit 1fb8d4
 *
Packit 1fb8d4
 * \param callback a pointer to custom initialization / cleanup functions.
Packit 1fb8d4
 * 								 Can be NULL if not used.
Packit 1fb8d4
 *
Packit 1fb8d4
 * \return A pointer to a newly allocated MessageQueue or NULL.
Packit 1fb8d4
 */
Packit 1fb8d4
WINPR_API wMessageQueue* MessageQueue_New(const wObject* callback);
Packit 1fb8d4
Packit 1fb8d4
/*! \brief Frees resources allocated by a message queue.
Packit 1fb8d4
 * 				 This function will only free resources allocated
Packit 1fb8d4
 *				 internally.
Packit 1fb8d4
 *
Packit 1fb8d4
 * \note Empty the queue before calling this function with
Packit 1fb8d4
 * 			 'MessageQueue_Clear', 'MessageQueue_Get' or
Packit 1fb8d4
 * 			 'MessageQueue_Peek' to free all resources allocated
Packit 1fb8d4
 * 			 by the message contained.
Packit 1fb8d4
 *
Packit 1fb8d4
 * \param queue A pointer to the queue to be freed.
Packit 1fb8d4
 */
Packit 1fb8d4
WINPR_API void MessageQueue_Free(wMessageQueue* queue);
Packit 1fb8d4
Packit 1fb8d4
/* Message Pipe */
Packit 1fb8d4
Packit 1fb8d4
struct _wMessagePipe
Packit 1fb8d4
{
Packit 1fb8d4
	wMessageQueue* In;
Packit 1fb8d4
	wMessageQueue* Out;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wMessagePipe wMessagePipe;
Packit 1fb8d4
Packit 1fb8d4
WINPR_API void MessagePipe_PostQuit(wMessagePipe* pipe, int nExitCode);
Packit 1fb8d4
Packit 1fb8d4
WINPR_API wMessagePipe* MessagePipe_New(void);
Packit 1fb8d4
WINPR_API void MessagePipe_Free(wMessagePipe* pipe);
Packit 1fb8d4
Packit 1fb8d4
/* Publisher/Subscriber Pattern */
Packit 1fb8d4
Packit 1fb8d4
struct _wEventArgs
Packit 1fb8d4
{
Packit 1fb8d4
	DWORD Size;
Packit 1fb8d4
	const char* Sender;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wEventArgs wEventArgs;
Packit 1fb8d4
Packit 1fb8d4
typedef void (*pEventHandler)(void* context, wEventArgs* e);
Packit 1fb8d4
Packit 1fb8d4
#define MAX_EVENT_HANDLERS	32
Packit 1fb8d4
Packit 1fb8d4
struct _wEventType
Packit 1fb8d4
{
Packit 1fb8d4
	const char* EventName;
Packit 1fb8d4
	wEventArgs EventArgs;
Packit 1fb8d4
	int EventHandlerCount;
Packit 1fb8d4
	pEventHandler EventHandlers[MAX_EVENT_HANDLERS];
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _wEventType wEventType;
Packit 1fb8d4
Packit 1fb8d4
#define EventArgsInit(_event_args, _sender) \
Packit 1fb8d4
	memset(_event_args, 0, sizeof(*_event_args)); \
Packit 1fb8d4
	((wEventArgs*) _event_args)->Size = sizeof(*_event_args); \
Packit 1fb8d4
	((wEventArgs*) _event_args)->Sender = _sender
Packit 1fb8d4
Packit 1fb8d4
#define DEFINE_EVENT_HANDLER(_name) \
Packit 1fb8d4
	typedef void (*p ## _name ## EventHandler)(void* context, _name ## EventArgs* e)
Packit 1fb8d4
Packit 1fb8d4
#define DEFINE_EVENT_RAISE(_name) \
Packit 1fb8d4
	static INLINE int PubSub_On ## _name (wPubSub* pubSub, void* context, _name ## EventArgs* e) { \
Packit 1fb8d4
		return PubSub_OnEvent(pubSub, #_name, context, (wEventArgs*) e); }
Packit 1fb8d4
Packit 1fb8d4
#define DEFINE_EVENT_SUBSCRIBE(_name) \
Packit 1fb8d4
	static INLINE int PubSub_Subscribe ## _name (wPubSub* pubSub, p ## _name ## EventHandler EventHandler) { \
Packit 1fb8d4
		return PubSub_Subscribe(pubSub, #_name, (pEventHandler) EventHandler); }
Packit 1fb8d4
Packit 1fb8d4
#define DEFINE_EVENT_UNSUBSCRIBE(_name) \
Packit 1fb8d4
	static INLINE int PubSub_Unsubscribe ## _name (wPubSub* pubSub, p ## _name ## EventHandler EventHandler) { \
Packit 1fb8d4
		return PubSub_Unsubscribe(pubSub, #_name, (pEventHandler) EventHandler); }
Packit 1fb8d4
Packit 1fb8d4
#define DEFINE_EVENT_BEGIN(_name) \
Packit 1fb8d4
	typedef struct _ ## _name ## EventArgs { \
Packit 1fb8d4
		wEventArgs e;
Packit 1fb8d4
Packit 1fb8d4
#define DEFINE_EVENT_END(_name) \
Packit 1fb8d4
	} _name ## EventArgs; \
Packit 1fb8d4
	DEFINE_EVENT_HANDLER(_name); \
Packit 1fb8d4
	DEFINE_EVENT_RAISE(_name) \
Packit 1fb8d4
	DEFINE_EVENT_SUBSCRIBE(_name) \
Packit 1fb8d4
	DEFINE_EVENT_UNSUBSCRIBE(_name)
Packit 1fb8d4
Packit 1fb8d4
#define DEFINE_EVENT_ENTRY(_name) \
Packit 1fb8d4
    { #_name, { sizeof( _name ## EventArgs), NULL }, 0, { NULL } },
Packit 1fb8d4
Packit 1fb8d4
	struct _wPubSub
Packit 1fb8d4
	{
Packit 1fb8d4
		CRITICAL_SECTION lock;
Packit 1fb8d4
		BOOL synchronized;
Packit 1fb8d4
Packit 1fb8d4
		int size;
Packit 1fb8d4
		int count;
Packit 1fb8d4
		wEventType* events;
Packit 1fb8d4
	};
Packit 1fb8d4
	typedef struct _wPubSub wPubSub;
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API void PubSub_Lock(wPubSub* pubSub);
Packit 1fb8d4
	WINPR_API void PubSub_Unlock(wPubSub* pubSub);
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API wEventType* PubSub_GetEventTypes(wPubSub* pubSub, int* count);
Packit 1fb8d4
	WINPR_API void PubSub_AddEventTypes(wPubSub* pubSub, wEventType* events, int count);
Packit 1fb8d4
	WINPR_API wEventType* PubSub_FindEventType(wPubSub* pubSub, const char* EventName);
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API int PubSub_Subscribe(wPubSub* pubSub, const char* EventName, pEventHandler EventHandler);
Packit 1fb8d4
	WINPR_API int PubSub_Unsubscribe(wPubSub* pubSub, const char* EventName,
Packit 1fb8d4
	                                 pEventHandler EventHandler);
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API int PubSub_OnEvent(wPubSub* pubSub, const char* EventName, void* context, wEventArgs* e);
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API wPubSub* PubSub_New(BOOL synchronized);
Packit 1fb8d4
	WINPR_API void PubSub_Free(wPubSub* pubSub);
Packit 1fb8d4
Packit 1fb8d4
	/* BipBuffer */
Packit 1fb8d4
Packit 1fb8d4
	struct _wBipBlock
Packit 1fb8d4
	{
Packit 1fb8d4
		size_t index;
Packit 1fb8d4
		size_t size;
Packit 1fb8d4
	};
Packit 1fb8d4
	typedef struct _wBipBlock wBipBlock;
Packit 1fb8d4
Packit 1fb8d4
	struct _wBipBuffer
Packit 1fb8d4
	{
Packit 1fb8d4
		size_t size;
Packit 1fb8d4
		BYTE* buffer;
Packit 1fb8d4
		size_t pageSize;
Packit 1fb8d4
		wBipBlock blockA;
Packit 1fb8d4
		wBipBlock blockB;
Packit 1fb8d4
		wBipBlock readR;
Packit 1fb8d4
		wBipBlock writeR;
Packit 1fb8d4
	};
Packit 1fb8d4
	typedef struct _wBipBuffer wBipBuffer;
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API BOOL BipBuffer_Grow(wBipBuffer* bb, size_t size);
Packit 1fb8d4
	WINPR_API void BipBuffer_Clear(wBipBuffer* bb);
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API size_t BipBuffer_UsedSize(wBipBuffer* bb);
Packit 1fb8d4
	WINPR_API size_t BipBuffer_BufferSize(wBipBuffer* bb);
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API BYTE* BipBuffer_WriteReserve(wBipBuffer* bb, size_t size);
Packit 1fb8d4
	WINPR_API BYTE* BipBuffer_WriteTryReserve(wBipBuffer* bb, size_t size, size_t* reserved);
Packit 1fb8d4
	WINPR_API void BipBuffer_WriteCommit(wBipBuffer* bb, size_t size);
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API BYTE* BipBuffer_ReadReserve(wBipBuffer* bb, size_t size);
Packit 1fb8d4
	WINPR_API BYTE* BipBuffer_ReadTryReserve(wBipBuffer* bb, size_t size, size_t* reserved);
Packit 1fb8d4
	WINPR_API void BipBuffer_ReadCommit(wBipBuffer* bb, size_t size);
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API int BipBuffer_Read(wBipBuffer* bb, BYTE* data, size_t size);
Packit 1fb8d4
	WINPR_API int BipBuffer_Write(wBipBuffer* bb, BYTE* data, size_t size);
Packit 1fb8d4
Packit 1fb8d4
	WINPR_API wBipBuffer* BipBuffer_New(size_t size);
Packit 1fb8d4
	WINPR_API void BipBuffer_Free(wBipBuffer* bb);
Packit 1fb8d4
Packit 1fb8d4
#ifdef __cplusplus
Packit 1fb8d4
}
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#endif /* WINPR_COLLECTIONS_H */