Merge branch 'master' of https://github.com/Doy-lee/dqn
This commit is contained in:
		
						commit
						49577e2c27
					
				| @ -24,7 +24,7 @@ void DqnFixedString_Test() | |||||||
|     { |     { | ||||||
|         DqnFixedString<512> str = DQN_SLICE("hello world"); |         DqnFixedString<512> str = DQN_SLICE("hello world"); | ||||||
|         DQN_ASSERT(str.Sprintf("hello %s", "sailor")); |         DQN_ASSERT(str.Sprintf("hello %s", "sailor")); | ||||||
|         DQN_ASSERT(DqnStr_Cmp(str.str, "hello sailor") == 0); |         DQN_ASSERTM(DqnStr_Cmp(str.str, "hello sailor") == 0, "Result: %s", str.str); | ||||||
| 
 | 
 | ||||||
|         Log(Status::Ok, "Sprintf"); |         Log(Status::Ok, "Sprintf"); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -136,7 +136,6 @@ void LogHeader(char const *funcName) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #include "DqnFixedString.cpp" | #include "DqnFixedString.cpp" | ||||||
| #include "DqnOS.cpp" |  | ||||||
| 
 | 
 | ||||||
| void HandmadeMathVerifyMat4(DqnMat4 dqnMat, hmm_mat4 hmmMat) | void HandmadeMathVerifyMat4(DqnMat4 dqnMat, hmm_mat4 hmmMat) | ||||||
| { | { | ||||||
| @ -1180,7 +1179,7 @@ void DqnArray_TestInternal(DqnMemAPI *const memAPI) | |||||||
|         DqnArray<DqnV2> array(memAPI); |         DqnArray<DqnV2> array(memAPI); | ||||||
|         if (1) |         if (1) | ||||||
|         { |         { | ||||||
|             DQN_ASSERT(array.Reserve(1)); |             array.Reserve(1); | ||||||
|             DQN_ASSERT(array.max >= 1); |             DQN_ASSERT(array.max >= 1); | ||||||
|             DQN_ASSERT(array.count == 0); |             DQN_ASSERT(array.count == 0); | ||||||
| 
 | 
 | ||||||
| @ -1313,7 +1312,7 @@ void DqnArray_TestInternal(DqnMemAPI *const memAPI) | |||||||
| 
 | 
 | ||||||
|         if (1) |         if (1) | ||||||
|         { |         { | ||||||
|             DQN_ASSERT(array.Reserve(1)); |             array.Reserve(1); | ||||||
|             DQN_ASSERT(array.max >= 1); |             DQN_ASSERT(array.max >= 1); | ||||||
|             DQN_ASSERT(array.count == 0); |             DQN_ASSERT(array.count == 0); | ||||||
|             Log(Status::Ok, "Empty array"); |             Log(Status::Ok, "Empty array"); | ||||||
| @ -1327,7 +1326,7 @@ void DqnArray_TestInternal(DqnMemAPI *const memAPI) | |||||||
|             DqnV2 c = DqnV2(5, 6); |             DqnV2 c = DqnV2(5, 6); | ||||||
|             DqnV2 d = DqnV2(7, 8); |             DqnV2 d = DqnV2(7, 8); | ||||||
| 
 | 
 | ||||||
|             DQN_ASSERT(array.Reserve(16)); |             array.Reserve(16); | ||||||
|             DQN_ASSERT(array.max >= 16); |             DQN_ASSERT(array.max >= 16); | ||||||
|             DQN_ASSERT(array.count == 0); |             DQN_ASSERT(array.count == 0); | ||||||
| 
 | 
 | ||||||
| @ -1376,7 +1375,7 @@ void DqnArray_TestInternal(DqnMemAPI *const memAPI) | |||||||
|             DqnV2 c = DqnV2(5, 6); |             DqnV2 c = DqnV2(5, 6); | ||||||
|             DqnV2 d = DqnV2(7, 8); |             DqnV2 d = DqnV2(7, 8); | ||||||
| 
 | 
 | ||||||
|             DQN_ASSERT(array.Reserve(16)); |             array.Reserve(16); | ||||||
| 
 | 
 | ||||||
|             DQN_ASSERT(array.Push(a)); |             DQN_ASSERT(array.Push(a)); | ||||||
|             DQN_ASSERT(array.Push(b)); |             DQN_ASSERT(array.Push(b)); | ||||||
| @ -1605,7 +1604,7 @@ void DqnArray_Test() | |||||||
|         if (1) |         if (1) | ||||||
|         { |         { | ||||||
|             DqnArray<char> array = {}; |             DqnArray<char> array = {}; | ||||||
|             DQN_ASSERT(array.Reserve(1)); |             array.Reserve(1); | ||||||
|             DqnArray_TestRealDataInternal(&array); |             DqnArray_TestRealDataInternal(&array); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -1617,7 +1616,7 @@ void DqnArray_Test() | |||||||
|             { |             { | ||||||
|                 auto memGuard0 = stack.TempRegionGuard(); |                 auto memGuard0 = stack.TempRegionGuard(); | ||||||
|                 DqnArray<char> array(&stack.myHeadAPI); |                 DqnArray<char> array(&stack.myHeadAPI); | ||||||
|                 DQN_ASSERT(array.Reserve(1)); |                 array.Reserve(1); | ||||||
|                 DqnArray_TestRealDataInternal(&array); |                 DqnArray_TestRealDataInternal(&array); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
| @ -1626,7 +1625,7 @@ void DqnArray_Test() | |||||||
|             { |             { | ||||||
|                 auto memGuard0 = stack.TempRegionGuard(); |                 auto memGuard0 = stack.TempRegionGuard(); | ||||||
|                 DqnArray<char> array(&stack.myHeadAPI); |                 DqnArray<char> array(&stack.myHeadAPI); | ||||||
|                 DQN_ASSERT(array.Reserve(128)); |                 array.Reserve(128); | ||||||
|                 stack.Push(1024); |                 stack.Push(1024); | ||||||
|                 DqnArray_TestRealDataInternal(&array); |                 DqnArray_TestRealDataInternal(&array); | ||||||
|             } |             } | ||||||
| @ -2898,7 +2897,7 @@ int main(void) | |||||||
|     DqnFixedString_Test(); |     DqnFixedString_Test(); | ||||||
| 
 | 
 | ||||||
| #ifdef DQN_PLATFORM_HEADER | #ifdef DQN_PLATFORM_HEADER | ||||||
|     DqnOS_Test(); |     // DqnOS_Test();
 | ||||||
|     DqnFile_Test(); |     DqnFile_Test(); | ||||||
|     DqnTimer_Test(); |     DqnTimer_Test(); | ||||||
|     DqnJobQueue_Test(); |     DqnJobQueue_Test(); | ||||||
|  | |||||||
							
								
								
									
										63
									
								
								dqn.h
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								dqn.h
									
									
									
									
									
								
							| @ -1147,9 +1147,9 @@ struct DqnArray | |||||||
|     void  Free       ()                                           { if (data) { memAPI->Free(data); } *this = {}; } |     void  Free       ()                                           { if (data) { memAPI->Free(data); } *this = {}; } | ||||||
|     T    *Front      ()                                           { DQN_ASSERT(count > 0); return data + 0; } |     T    *Front      ()                                           { DQN_ASSERT(count > 0); return data + 0; } | ||||||
|     T    *Back       ()                                           { DQN_ASSERT(count > 0); return data + (count - 1); } |     T    *Back       ()                                           { DQN_ASSERT(count > 0); return data + (count - 1); } | ||||||
|     bool  Resize     (isize newCount)                             { if (newCount > max) Reserve(GrowCapacity_(newCount)); count = newCount; } |     void  Resize     (isize newCount)                             { if (newCount > max) Reserve(GrowCapacity_(newCount)); count = newCount; } | ||||||
|     bool  Resize     (isize newCount, T const *v)                 { if (newCount > max) Reserve(GrowCapacity_(newCount)); if (newCount > count) for (isize n = count; n < newCount; n++) data[n] = *v; count = newCount; } |     void  Resize     (isize newCount, T const *v)                 { if (newCount > max) Reserve(GrowCapacity_(newCount)); if (newCount > count) for (isize n = count; n < newCount; n++) data[n] = *v; count = newCount; } | ||||||
|     bool  Reserve    (isize newMax); |     void  Reserve    (isize newMax); | ||||||
|     T    *Push       (T const &v)                                 { return Insert(count, &v, 1); } |     T    *Push       (T const &v)                                 { return Insert(count, &v, 1); } | ||||||
|     T    *Push       (T const *v, isize numItems = 1)             { return Insert(count,  v, numItems); } |     T    *Push       (T const *v, isize numItems = 1)             { return Insert(count,  v, numItems); } | ||||||
|     void  Pop        ()                                           { if (count > 0) count--; } |     void  Pop        ()                                           { if (count > 0) count--; } | ||||||
| @ -1173,10 +1173,7 @@ template<typename T> T *DqnArray<T>::Insert(isize index, T const *v, isize numIt | |||||||
|     index                = DQN_MIN(DQN_MAX(index, 0), count); |     index                = DQN_MIN(DQN_MAX(index, 0), count); | ||||||
|     isize const newCount = count + numItems; |     isize const newCount = count + numItems; | ||||||
| 
 | 
 | ||||||
|     if (newCount >= max && !Reserve(GrowCapacity_(newCount))) |     if (newCount >= max) Reserve(GrowCapacity_(newCount)); | ||||||
|     { |  | ||||||
|         return nullptr; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     T *src  = data + index; |     T *src  = data + index; | ||||||
|     T *dest = src + numItems; |     T *dest = src + numItems; | ||||||
| @ -1198,24 +1195,27 @@ template <typename T> void DqnArray<T>::EraseStable(isize index) | |||||||
|     count--; |     count--; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| template <typename T> bool DqnArray<T>::Reserve(isize newMax) | template <typename T> void DqnArray<T>::Reserve(isize newMax) | ||||||
| { | { | ||||||
|     if (newMax <= max) return true; |     // TODO(doyle): Super hard asserts
 | ||||||
| 
 |     if (newMax <= max) return; | ||||||
|     if (data) |     if (data) | ||||||
|     { |     { | ||||||
|         T *newData = (T *)memAPI->Realloc(data, max * sizeof(T), newMax * sizeof(T)); |         T *newData = (T *)memAPI->Realloc(data, max * sizeof(T), newMax * sizeof(T)); | ||||||
|  |         DQN_ASSERT(newData); | ||||||
|         if (newData) |         if (newData) | ||||||
|         { |         { | ||||||
|             data = newData; |             data = newData; | ||||||
|             max  = newMax; |             max  = newMax; | ||||||
|         } |         } | ||||||
|         return newData; |  | ||||||
|     } |     } | ||||||
| 
 |     else | ||||||
|  |     { | ||||||
|       data = (T *)memAPI->Alloc(newMax * sizeof(T)); |       data = (T *)memAPI->Alloc(newMax * sizeof(T)); | ||||||
|       max  = newMax; |       max  = newMax; | ||||||
|     return data; |       DQN_ASSERT(data); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #if 0 | #if 0 | ||||||
| @ -3622,7 +3622,7 @@ void DqnAllocatorMetadata::Init(bool boundsGuard) | |||||||
|         this->boundsGuardSize        = sizeof(HEAD_GUARD_VALUE); |         this->boundsGuardSize        = sizeof(HEAD_GUARD_VALUE); | ||||||
|         LOCAL_PERSIST DqnMemAPI heap = DqnMemAPI::HeapAllocator(); |         LOCAL_PERSIST DqnMemAPI heap = DqnMemAPI::HeapAllocator(); | ||||||
|         this->allocations.memAPI     = &heap; |         this->allocations.memAPI     = &heap; | ||||||
|         DQN_ASSERT(this->allocations.Reserve(128)); |         this->allocations.Reserve(128); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
| @ -8057,13 +8057,8 @@ DQN_FILE__LIST_DIR(DqnFile__PlatformListDir) | |||||||
| #endif // DQN__WIN32_PLATFORM
 | #endif // DQN__WIN32_PLATFORM
 | ||||||
| 
 | 
 | ||||||
| #ifdef DQN__UNIX_PLATFORM | #ifdef DQN__UNIX_PLATFORM | ||||||
| FILE_SCOPE bool DqnFile__UnixGetFileSizeWithStat(FILE *file, char const *path, usize *size) | FILE_SCOPE bool DqnFile__UnixGetFileSize(char const *path, usize *size) | ||||||
| { | { | ||||||
|     if (!file) |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     struct stat fileStat = {}; |     struct stat fileStat = {}; | ||||||
|     if (stat(path, &fileStat)) |     if (stat(path, &fileStat)) | ||||||
|     { |     { | ||||||
| @ -8077,6 +8072,12 @@ FILE_SCOPE bool DqnFile__UnixGetFileSizeWithStat(FILE *file, char const *path, u | |||||||
|     // But there can also be zero-byte files, we can't be sure. So manual check by counting bytes
 |     // But there can also be zero-byte files, we can't be sure. So manual check by counting bytes
 | ||||||
|     if (*size == 0) |     if (*size == 0) | ||||||
|     { |     { | ||||||
|  |         FILE *file = fopen(path, "r"); | ||||||
|  |         if (!file) | ||||||
|  |         { | ||||||
|  |           return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         u64 fileSizeInBytes = 0; |         u64 fileSizeInBytes = 0; | ||||||
| 
 | 
 | ||||||
|         char c = fgetc(file); |         char c = fgetc(file); | ||||||
| @ -8142,16 +8143,15 @@ DqnFile__UnixOpen(char const *path, DqnFile *file, u32 flags, DqnFile::Action ac | |||||||
| 
 | 
 | ||||||
|     // TODO(doyle): Use open syscall
 |     // TODO(doyle): Use open syscall
 | ||||||
|     // TODO(doyle): Query errno
 |     // TODO(doyle): Query errno
 | ||||||
|     file->handle = reinterpret_cast<void *>(fopen(path, mode)); |     if (!DqnFile__UnixGetFileSize(path, &file->size)) | ||||||
|     if (!DqnFile__UnixGetFileSize(reinterpret_cast<FILE *>(file->handle), path, &file->size)) |  | ||||||
|     { |     { | ||||||
|         // TODO(doyle): Logging
 |         // TODO(doyle): Logging
 | ||||||
|         fclose(handle); |  | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     file->handle = reinterpret_cast<void *>(fopen(path, mode)); | ||||||
|     file->flags = flags; |     file->flags = flags; | ||||||
|     return true; |     return file->handle; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| DQN_FILE__LIST_DIR(DqnFile__PlatformListDir) | DQN_FILE__LIST_DIR(DqnFile__PlatformListDir) | ||||||
| @ -8210,7 +8210,7 @@ DQN_FILE__LIST_DIR(DqnFile__PlatformListDir) | |||||||
|         *numFiles      = currNumFiles; |         *numFiles      = currNumFiles; | ||||||
|         while (dirFile) |         while (dirFile) | ||||||
|         { |         { | ||||||
|             DqnStr_Copy(list[listIndex++], dirFile->d_name, DQN_ARRAY_COUNT(dirFile->d_name)); |             DqnMem_Copy(list[listIndex++], dirFile->d_name, DQN_ARRAY_COUNT(dirFile->d_name)); | ||||||
|             dirFile = readdir(dirHandle); |             dirFile = readdir(dirHandle); | ||||||
|         } |         } | ||||||
|         closedir(dirHandle); |         closedir(dirHandle); | ||||||
| @ -8470,18 +8470,7 @@ bool DqnFile::GetFileSize(char const *path, usize *size) | |||||||
| 
 | 
 | ||||||
| #elif defined(DQN__UNIX_PLATFORM) | #elif defined(DQN__UNIX_PLATFORM) | ||||||
|     // TODO(doyle): Error logging
 |     // TODO(doyle): Error logging
 | ||||||
|     if (!DqnFile__UnixGetFileSizeWithStat(path, size)) return false; |     if (!DqnFile__UnixGetFileSize(path, size)) return false; | ||||||
| 
 |  | ||||||
|     // NOTE: 0 size can occur in some instances where files are generated on demand,
 |  | ||||||
|     //       i.e. /proc/cpuinfo
 |  | ||||||
|     if (*size == 0) |  | ||||||
|     { |  | ||||||
|         // If stat fails, then do a manual byte count
 |  | ||||||
|         FILE *handle = fopen(path, "r"); |  | ||||||
|         *size        = DqnFile__UnixGetFileSizeManual(handle, false); |  | ||||||
|         fclose(handle); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return true; |     return true; | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user