Improve DqnArray::Insert

This commit is contained in:
Doyle T 2018-07-03 23:01:15 +10:00
parent 6df3b32f4e
commit 4ee040b6b0
2 changed files with 41 additions and 10 deletions

32
DqnUnitTest.sln Normal file
View File

@ -0,0 +1,32 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27428.2037
MinimumVisualStudioVersion = 10.0.40219.1
Project("{911E67C6-3D85-4FCE-B560-20A9C3E3FF48}") = "DqnUnitTest", "bin\DqnUnitTest.exe", "{F1606403-E704-4C35-8354-8E33DE4F5CCF}"
ProjectSection(DebuggerProjectSystem) = preProject
PortSupplier = 00000000-0000-0000-0000-000000000000
Executable = F:\dev\dqn\bin\DqnUnitTest.exe
RemoteMachine = THAI-XPS13
StartingDirectory = F:\dev\dqn\
Environment = Default
LaunchingEngine = 00000000-0000-0000-0000-000000000000
UseLegacyDebugEngines = No
LaunchSQLEngine = No
AttachLaunchAction = No
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F1606403-E704-4C35-8354-8E33DE4F5CCF}.Release|x64.ActiveCfg = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8DD71C86-534C-4A9C-A217-CBA13DE8DA5A}
EndGlobalSection
EndGlobal

19
dqn.h
View File

@ -1170,8 +1170,7 @@ private:
template<typename T> T *DqnArray<T>::Insert(isize index, T const *v, isize numItems) template<typename T> T *DqnArray<T>::Insert(isize index, T const *v, isize numItems)
{ {
index = DQN_MIN(DQN_MAX(index, 0), count); index = DQN_MIN(DQN_MAX(index, 0), count);
isize const off = (data + index) - data;
isize const newCount = count + numItems; isize const newCount = count + numItems;
if (newCount >= max && !Reserve(GrowCapacity_(newCount))) if (newCount >= max && !Reserve(GrowCapacity_(newCount)))
@ -1179,15 +1178,16 @@ template<typename T> T *DqnArray<T>::Insert(isize index, T const *v, isize numIt
return nullptr; return nullptr;
} }
count = newCount; T *src = data + index;
T *start = data + off; T *dest = src + numItems;
if (off < count) if (src < dest)
memmove(start + numItems, start, ((usize)count - (usize)off) * sizeof(T)); memmove(dest, src, ((data + count) - src) * sizeof(T));
for (isize i = 0; i < numItems; i++) for (isize i = 0; i < numItems; i++)
data[off + i] = v[i]; src[i] = v[i];
return data + off; count = newCount;
return src;
} }
template <typename T> void DqnArray<T>::EraseStable(isize index) template <typename T> void DqnArray<T>::EraseStable(isize index)
@ -2163,7 +2163,7 @@ struct DqnFixedString
int VSprintf (char const *fmt, va_list argList); int VSprintf (char const *fmt, va_list argList);
int VSprintfAppend(char const *fmt, va_list argList); int VSprintfAppend(char const *fmt, va_list argList);
void Clear (Dqn::ZeroClear clear = Dqn::ZeroClear::No) { if (clear == Dqn::ZeroClear::Yes) DqnMem_Set(str, 0, MAX); this = {}; } void Clear (Dqn::ZeroClear clear = Dqn::ZeroClear::No) { if (clear == Dqn::ZeroClear::Yes) DqnMem_Set(str, 0, MAX); *this = {}; }
}; };
template <unsigned int MAX> template <unsigned int MAX>
@ -8802,7 +8802,6 @@ DqnLockGuard::~DqnLockGuard()
// XPlatform > #DqnJobQueue // XPlatform > #DqnJobQueue
// ================================================================================================= // =================================================================================================
typedef void *DqnThreadCallbackInternal(void *threadParam); typedef void *DqnThreadCallbackInternal(void *threadParam);
usize DQN_JOB_QUEUE_INTERNAL_THREAD_DEFAULT_STACK_SIZE = 0; usize DQN_JOB_QUEUE_INTERNAL_THREAD_DEFAULT_STACK_SIZE = 0;