requires stuff from lol/math, too.undefined
@@ -41,6 +41,9 @@ liblolcore_headers = \ | |||
lol/math/geometry.h lol/math/interp.h lol/math/rand.h \ | |||
lol/math/constants.h \ | |||
\ | |||
lol/algorithm/all.h \ | |||
lol/algorithm/sort.h \ | |||
\ | |||
lol/sys/all.h \ | |||
lol/sys/init.h lol/sys/file.h lol/sys/thread.h lol/sys/atomic.h \ | |||
lol/sys/timer.h \ | |||
@@ -154,6 +154,7 @@ static inline int isnan(float f) | |||
// Base types | |||
#include <lol/base/all.h> | |||
#include <lol/math/all.h> | |||
#include <lol/algorithm/all.h> | |||
#include <lol/sys/all.h> | |||
#include <lol/gpu/all.h> | |||
#include <lol/image/all.h> | |||
@@ -0,0 +1,17 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// | |||
#if !defined __LOL_ALGORITHM_ALL_H__ | |||
#define __LOL_ALGORITHM_ALL_H__ | |||
#include <lol/algorithm/sort.h> | |||
#endif // __LOL_ALGORITHM_ALL_H__ | |||
@@ -0,0 +1,101 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||
// (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// | |||
#if !defined __LOL_ALGORITHM_SORT_H__ | |||
#define __LOL_ALGORITHM_SORT_H__ | |||
#include <lol/base/array.h> | |||
namespace lol | |||
{ | |||
template<typename T, typename ARRAY> | |||
void ArrayBase<T, ARRAY>::Sort(int sort) | |||
{ | |||
int s = 0; | |||
// Classic bubble | |||
if (s++ == sort) | |||
{ | |||
int d = 1; | |||
for (int i = 0; i < Count() - 1; i = lol::max(i + d, 0)) | |||
{ | |||
if (m_data[i] < m_data[i + 1] || i <= 0) | |||
d = 1; | |||
if (m_data[i + 1] < m_data[i]) | |||
{ | |||
Swap(i, i + 1); | |||
d = -1; | |||
} | |||
} | |||
} | |||
// Quick sort with swap | |||
else if (s++ == sort) | |||
{ | |||
SortQuickSwap(0, Count()); | |||
} | |||
} | |||
template<typename T, typename ARRAY> | |||
void ArrayBase<T, ARRAY>::SortQuickSwap(int start, int stop) | |||
{ | |||
int m[3] = | |||
{ | |||
rand(start, stop), | |||
rand(start, stop), | |||
rand(start, stop) | |||
}; | |||
for (int i = 0; i < 2; ) | |||
{ | |||
if (m_data[m[i+1]] < m_data[m[i]]) | |||
{ | |||
int mt = m[i+1]; | |||
m[i+1] = m[i]; | |||
m[i] = mt; | |||
i = 0; | |||
} | |||
else | |||
i++; | |||
} | |||
//actual stuff | |||
T median = m_data[m[1]]; | |||
int i0 = start; | |||
int i1 = stop - 1; | |||
bool swap = false; | |||
while (i0 < i1) | |||
{ | |||
if (m_data[i0] >= median && m_data[i1] < median) | |||
{ | |||
Swap(i0, i1); | |||
i0++; | |||
i1--; | |||
swap = true; | |||
} | |||
else | |||
{ | |||
if (m_data[i0] < median) | |||
i0++; | |||
if (m_data[i1] >= median) | |||
i1--; | |||
} | |||
} | |||
if (stop - start == 1 || !swap) | |||
return; | |||
if (start < i0) | |||
SortQuickSwap(start, i0); | |||
if (i0 < stop) | |||
SortQuickSwap(i0, stop); | |||
} | |||
} /* namespace lol */ | |||
#endif // __LOL_ALGORITHM_SORT_H__ | |||
@@ -1,7 +1,8 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||
// (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
@@ -331,81 +332,10 @@ public: | |||
m_reserved = toreserve; | |||
} | |||
void Sort(int sort) | |||
{ | |||
int s = 0; | |||
//Classic bubble | |||
if (s++ == sort) | |||
{ | |||
int d = 1; | |||
for (int i = 0; i < Count() - 1; i = lol::max(i + d, 0)) | |||
{ | |||
if (m_data[i] < m_data[i + 1] || i <= 0) | |||
d = 1; | |||
if (m_data[i + 1] < m_data[i]) | |||
{ | |||
Swap(i, i + 1); | |||
d = -1; | |||
} | |||
} | |||
} | |||
//Quick sort with swap | |||
else if (s++ == sort) | |||
{ | |||
SortQuickSwap(0, Count()); | |||
} | |||
} | |||
void SortQuickSwap(int start, int max) | |||
{ | |||
int m[3] = { start + rand(max - start), | |||
start + rand(max - start), | |||
start + rand(max - start) }; | |||
int i = 0; | |||
while (i < 2) | |||
{ | |||
if (m_data[m[i+1]] < m_data[m[i]]) | |||
{ | |||
int mt = m[i+1]; | |||
m[i+1] = m[i]; | |||
m[i] = mt; | |||
i = 0; | |||
} | |||
else | |||
i++; | |||
} | |||
//actual stuff | |||
T median = m_data[m[1]]; | |||
int i0 = start; | |||
int i1 = max - 1; | |||
bool swap = false; | |||
while (i0 < i1) | |||
{ | |||
if (m_data[i0] >= median && | |||
m_data[i1] < median) | |||
{ | |||
Swap(i0, i1); | |||
i0++; | |||
i1--; | |||
swap = true; | |||
} | |||
else | |||
{ | |||
if (m_data[i0] < median) | |||
i0++; | |||
if (m_data[i1] >= median) | |||
i1--; | |||
} | |||
} | |||
if (max - start == 1 || !swap) | |||
return; | |||
if (start < i0) | |||
SortQuickSwap(start, i0); | |||
if (i0 < max) | |||
SortQuickSwap(i0, max); | |||
} | |||
void Sort(int sort); | |||
void SortQuickSwap(int start, int stop); | |||
public: | |||
inline int Count() const { return m_count; } | |||
inline int Bytes() const { return m_count * sizeof(Element); } | |||
@@ -269,6 +269,8 @@ | |||
<ClInclude Include="light.h" /> | |||
<ClInclude Include="loldebug.h" /> | |||
<ClInclude Include="lolgl.h" /> | |||
<ClInclude Include="lol\algorithm\all.h" /> | |||
<ClInclude Include="lol\algorithm\sort.h" /> | |||
<ClInclude Include="lol\base\all.h" /> | |||
<ClInclude Include="lol\base\array.h" /> | |||
<ClInclude Include="lol\base\assert.h" /> | |||
@@ -31,6 +31,9 @@ | |||
<Filter Include="lol"> | |||
<UniqueIdentifier>{0edcf1a5-3c9c-4425-918c-aa2cbebc51c1}</UniqueIdentifier> | |||
</Filter> | |||
<Filter Include="lol\algorithm"> | |||
<UniqueIdentifier>{39f6f872-186f-48af-8e87-bcceb06b1b21}</UniqueIdentifier> | |||
</Filter> | |||
<Filter Include="lol\image"> | |||
<UniqueIdentifier>{f25b3187-b24c-469a-b038-5a968eaa83f6}</UniqueIdentifier> | |||
</Filter> | |||
@@ -357,6 +360,12 @@ | |||
<ClInclude Include="platform\sdl\sdlapp.h"> | |||
<Filter>platform\sdl</Filter> | |||
</ClInclude> | |||
<ClInclude Include="lol\algorithm\all.h"> | |||
<Filter>lol\algorithm</Filter> | |||
</ClInclude> | |||
<ClInclude Include="lol\algorithm\sort.h"> | |||
<Filter>lol\algorithm</Filter> | |||
</ClInclude> | |||
<ClInclude Include="lol\image\color.h"> | |||
<Filter>lol\image</Filter> | |||
</ClInclude> | |||