Add DqnPool and minor cleanup
This commit is contained in:
		
							parent
							
								
									c5d26f09c4
								
							
						
					
					
						commit
						602cc32744
					
				
							
								
								
									
										51
									
								
								DqnOS.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								DqnOS.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | struct DqnProcess | ||||||
|  | { | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void DqnOS_Test() | ||||||
|  | { | ||||||
|  |     // pid_t pid = vfork();
 | ||||||
|  |     // if (pid == 0)
 | ||||||
|  |     // {
 | ||||||
|  |     //     char const *argv[] = {"jim", "jams", NULL};
 | ||||||
|  |     //     char const *envp[] = {"some", "environment", NULL};
 | ||||||
|  |     //     chdir("/home/usr/loki/");
 | ||||||
|  |     //     execve(cmd, argv, envp);
 | ||||||
|  |     //     perror("Could not execute");
 | ||||||
|  |     // }
 | ||||||
|  | #if defined(DQN__IS_WIN32) | ||||||
|  |     // CreateProcessW();
 | ||||||
|  |     defer(printf("hello world\n")); | ||||||
|  | 
 | ||||||
|  |     WSAData wsaData; | ||||||
|  |     int result = WSAStartup(MAKEWORD(2, 2), &wsaData); | ||||||
|  |     if (result != 0) | ||||||
|  |     { | ||||||
|  |         fprintf(stderr, "WSAStartup failed: %d\n", result); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     addrinfo hints    = {}; | ||||||
|  |     hints.ai_family   = AF_UNSPEC; | ||||||
|  |     hints.ai_socktype = SOCK_STREAM; | ||||||
|  |     hints.ai_protocol = IPPROTO_TCP; | ||||||
|  | 
 | ||||||
|  |     addrinfo *foundAddr = nullptr; | ||||||
|  |     result = getaddrinfo("127.0.0.1", "38151", &hints, &foundAddr); | ||||||
|  |     if (result != 0) | ||||||
|  |     { | ||||||
|  |         fprintf(stderr, "getaddrinfo failed: %d\n", result); | ||||||
|  |         WSACleanup(); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     SOCKET connectSocket = socket(foundAddr->ai_family, foundAddr->ai_socktype, foundAddr->ai_protocol); | ||||||
|  |     if (connectSocket == INVALID_SOCKET) | ||||||
|  |     { | ||||||
|  |         fprintf(stderr, "socket failed: %d\n", WSAGetLastError()); | ||||||
|  |         freeaddrinfo(foundAddr); | ||||||
|  |         WSACleanup(); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | } | ||||||
							
								
								
									
										90
									
								
								dqn.h
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								dqn.h
									
									
									
									
									
								
							| @ -32,6 +32,7 @@ | |||||||
| // #Dqn_*          Utility code, (qsort, quick file reading)
 | // #Dqn_*          Utility code, (qsort, quick file reading)
 | ||||||
| // #DqnMem         Memory Allocation
 | // #DqnMem         Memory Allocation
 | ||||||
| // #DqnMemAPI      Custom memory API for Dqn Data Structures
 | // #DqnMemAPI      Custom memory API for Dqn Data Structures
 | ||||||
|  | // #DqnPool        Pool objects
 | ||||||
| // #DqnArray       Dynamic Array using Templates
 | // #DqnArray       Dynamic Array using Templates
 | ||||||
| // #DqnMemStack    Memory Allocator, Push, Pop Style
 | // #DqnMemStack    Memory Allocator, Push, Pop Style
 | ||||||
| // #DqnHash        Hashing using Murmur
 | // #DqnHash        Hashing using Murmur
 | ||||||
| @ -80,12 +81,6 @@ | |||||||
| 
 | 
 | ||||||
| #if defined(DQN_PLATFORM_IMPLEMENTATION) | #if defined(DQN_PLATFORM_IMPLEMENTATION) | ||||||
|     #define DQN__XPLATFORM_LAYER 1 |     #define DQN__XPLATFORM_LAYER 1 | ||||||
| 
 |  | ||||||
|     // #if defined(DQN__IS_WIN32)
 |  | ||||||
|     //     #define DQN__WIN32_PLATFORM 1
 |  | ||||||
|     // #else
 |  | ||||||
|     //     #define DQN__UNIX_PLATFORM 1
 |  | ||||||
|     // #endif
 |  | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| // #Portable Code
 | // #Portable Code
 | ||||||
| @ -859,9 +854,32 @@ public: | |||||||
|     bool  IsValid() const { return (this->allocator != nullptr); } |     bool  IsValid() const { return (this->allocator != nullptr); } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | // #DqnPool API
 | ||||||
|  | // =================================================================================================
 | ||||||
|  | template <typename T, i16 SIZE> | ||||||
|  | struct DqnPool | ||||||
|  | { | ||||||
|  |     struct Entry : public T | ||||||
|  |     { | ||||||
|  |         u16 nextIndex; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     const static isize SENTINEL_INDEX = SIZE; | ||||||
|  | 
 | ||||||
|  |     Entry  pool[SIZE]; | ||||||
|  |     i16    freeIndex; | ||||||
|  |     i16    numFree; | ||||||
|  | 
 | ||||||
|  |          DqnPool() : freeIndex(0) , numFree(SIZE) { DQN_FOR_EACH(i, SIZE - 1) { Entry *entry = pool + i; entry->nextIndex = i + 1; } Entry *last = pool + (SIZE - 1); last->nextIndex = SENTINEL_INDEX; } | ||||||
|  |     T   *GetNext()        { if (freeIndex == SENTINEL_INDEX) return nullptr; Entry *result = pool + freeIndex; freeIndex = result->nextIndex; numFree--; return result; } | ||||||
|  |     void Return (T *item) { auto *entry = reinterpret_cast<Entry *>(item); entry->nextIndex = freeIndex; freeIndex = pool - entry; numFree++; } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| FILE_SCOPE DqnMemAPI DQN_DEFAULT_HEAP_ALLOCATOR_ = DqnMemAPI::HeapAllocator(); | FILE_SCOPE DqnMemAPI DQN_DEFAULT_HEAP_ALLOCATOR_ = DqnMemAPI::HeapAllocator(); | ||||||
| FILE_SCOPE DqnMemAPI *DQN_DEFAULT_HEAP_ALLOCATOR = &DQN_DEFAULT_HEAP_ALLOCATOR_; | FILE_SCOPE DqnMemAPI *DQN_DEFAULT_HEAP_ALLOCATOR = &DQN_DEFAULT_HEAP_ALLOCATOR_; | ||||||
| 
 | 
 | ||||||
|  | // #DqnArray API
 | ||||||
|  | // =================================================================================================
 | ||||||
| template<typename T> | template<typename T> | ||||||
| struct DqnArray | struct DqnArray | ||||||
| { | { | ||||||
| @ -951,66 +969,6 @@ template <typename T> bool DqnArray<T>::Reserve(isize newMax) | |||||||
|     return data; |     return data; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #if 0 |  | ||||||
| // #DqnArray API
 |  | ||||||
| // =================================================================================================
 |  | ||||||
| template <typename T> |  | ||||||
| struct DqnArray |  | ||||||
| { |  | ||||||
|     DqnMemAPI *memAPI; // R/Write: The allocation scheme used, if null, it gets set to DQN_DEFAULT_HEAP_ALLOCATOR
 |  | ||||||
|     isize      count;  // Read: The number of item in the array
 |  | ||||||
|     isize      max;    // Read: Maximum size of array
 |  | ||||||
|     T         *data;   // Read: Item storage
 |  | ||||||
| 
 |  | ||||||
|     DqnArray() = default; // Zero Is Initialisation
 |  | ||||||
|     DqnArray(DqnMemAPI *memAPI_) { *this = {}; this->memAPI = memAPI_; } |  | ||||||
| 
 |  | ||||||
|     // API
 |  | ||||||
|     // =============================================================================================
 |  | ||||||
|     void  UseMemory   (T *data_, isize max_, isize count_ = 0) { this->memAPI = nullptr; this->data = data_; this->max = max_; this->count = count_; } |  | ||||||
| 
 |  | ||||||
|     void  Free        (); |  | ||||||
|     bool  Reserve     (isize newMax);              // If (newMax <= count) true is returned. False is returned only if out of memory.
 |  | ||||||
|     bool  Grow        (isize multiplier = 2); |  | ||||||
|     T    *Make        (isize num = 1);             // Increment array count by num and return a ptr to the start of an array of num elements.
 |  | ||||||
|     T    *Push        (T const *item, isize num);  // return: Last element pushed (this->data + this->count - 1), or null if out of memory.
 |  | ||||||
|     T    *Push        (T const  item);             // return: Last element pushed (this->data + this->count - 1), or null if out of memory.
 |  | ||||||
|     T    *Insert      (T const *item, isize numItems, isize index); |  | ||||||
|     T    *Insert      (T const  item, isize index); |  | ||||||
|     void  Pop         (); |  | ||||||
|     T    *Peek        (); |  | ||||||
|     T    *Get         (isize index); |  | ||||||
|     void  Clear       (Dqn::ZeroClear clear = Dqn::ZeroClear::No); |  | ||||||
|     bool  Remove      (isize index); |  | ||||||
|     bool  EraseStable(isize index); |  | ||||||
| 
 |  | ||||||
|      // indexList: Array of indexes to remove. This list gets sorted.
 |  | ||||||
|     void  EraseStable(isize *indexList, isize numIndexes); |  | ||||||
| 
 |  | ||||||
|     // C++ Iterator
 |  | ||||||
|     // =============================================================================================
 |  | ||||||
|     class Iterator |  | ||||||
|     { |  | ||||||
|         T *data; |  | ||||||
|     public: |  | ||||||
|         Iterator(T *data_) : data(data_) {} |  | ||||||
|         bool      operator!=(Iterator const &other) const { return this->data != other.data; } |  | ||||||
|         T        &operator* ()                      const { return *data; } |  | ||||||
|         Iterator  operator++()                            { data++; return *this; } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     T &operator[] (isize index) const { return this->data[index]; } |  | ||||||
|     Iterator begin()            const { return Iterator(this->data); } |  | ||||||
|     Iterator end  ()            const { return Iterator(this->data + this->count); } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| template <typename T> |  | ||||||
| struct DqnSmartArray : public DqnArray<T> |  | ||||||
| { |  | ||||||
|     ~DqnSmartArray() { if (this->data && this->memAPI) this->memAPI->Free(this->data); } |  | ||||||
| }; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| // #DqnAllocatorMetadata
 | // #DqnAllocatorMetadata
 | ||||||
| // =================================================================================================
 | // =================================================================================================
 | ||||||
| // Allocation Layout
 | // Allocation Layout
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user