Переглянути джерело

core: we can now set Map elements using simply map[foo] = bar, no need for

a Set() method. Also, new HasKey() method.
legacy
Sam Hocevar sam 12 роки тому
джерело
коміт
bbc2edcc8e
4 змінених файлів з 86 додано та 14 видалено
  1. +19
    -12
      src/lol/core/map.h
  2. +1
    -1
      test/Makefile.am
  3. +3
    -1
      test/testsuite.vcxproj
  4. +63
    -0
      test/unit/map.cpp

+ 19
- 12
src/lol/core/map.h Переглянути файл

@@ -20,37 +20,34 @@
namespace lol
{

/* A stupidly linear map for now */
/* A stupidly linear map for now. */
template<typename K, typename V> class Map : protected Hash<K>
{
public:
/* I choose to make this inline because passing the key by reference
* is usually suboptimal. */
inline V const& operator[] (K const &key) const
{
/* Look for the hash in our table and return the value. */
uint32_t hash = ((Hash<K> const &)*this)(key);
for (int i = 0; i < m_array.Count(); ++i)
if (m_array[i].m1 == hash)
if (m_array[i].m2 == key)
return m_array[i].m3;
/* XXX: this in an error! */
return V();
}

inline V & operator[] (K const &key)
{
return const_cast<V &>((const_cast<Map<K,V> const &>(*this))[key]);
}

inline V & Set(K const &key, V const &val)
{
/* Look for the hash in our table and return the value if found. */
uint32_t hash = ((Hash<K> const &)*this)(key);
for (int i = 0; i < m_array.Count(); ++i)
if (m_array[i].m1 == hash)
if (m_array[i].m2 == key)
{
m_array[i].m3.~V();
return m_array[i].m3 = val;
}

m_array.Push(hash, key, val);
return m_array[i].m3;
/* If not found, insert a new value. */
m_array.Push(hash, key, V());
return m_array.Last().m3;
}

@@ -66,6 +63,16 @@ public:
}
}

inline bool HasKey(K const &key)
{
uint32_t hash = ((Hash<K> const &)*this)(key);
for (int i = 0; i < m_array.Count(); ++i)
if (m_array[i].m1 == hash)
if (m_array[i].m2 == key)
return true;
return false;
}

private:
Array<uint32_t, K, V> m_array;
};


+ 1
- 1
test/Makefile.am Переглянути файл

@@ -22,7 +22,7 @@ endif
testsuite_SOURCES = testsuite.cpp \
unit/vector.cpp unit/matrix.cpp unit/half.cpp unit/trig.cpp \
unit/build.cpp unit/real.cpp unit/image.cpp unit/quat.cpp unit/cmplx.cpp \
unit/array.cpp unit/rotation.cpp unit/string.cpp
unit/array.cpp unit/rotation.cpp unit/string.cpp unit/map.cpp
testsuite_CPPFLAGS = @LOL_CFLAGS@
testsuite_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@
testsuite_DEPENDENCIES = $(top_builddir)/src/liblol.a


+ 3
- 1
test/testsuite.vcxproj Переглянути файл

@@ -41,10 +41,12 @@
<ClCompile Include="unit\cmplx.cpp" />
<ClCompile Include="unit\half.cpp" />
<ClCompile Include="unit\image.cpp" />
<ClCompile Include="unit\map.cpp" />
<ClCompile Include="unit\matrix.cpp" />
<ClCompile Include="unit\quat.cpp" />
<ClCompile Include="unit\real.cpp" />
<ClCompile Include="unit\rotation.cpp" />
<ClCompile Include="unit\string.cpp" />
<ClCompile Include="unit\trig.cpp" />
<ClCompile Include="unit\vector.cpp" />
</ItemGroup>
@@ -73,4 +75,4 @@
<ImportGroup Label="ExtensionTargets">
<Import Project="$(SolutionDir)\Lol.Fx.targets" />
</ImportGroup>
</Project>
</Project>

+ 63
- 0
test/unit/map.cpp Переглянути файл

@@ -0,0 +1,63 @@
//
// Lol Engine
//
// Copyright: (c) 2010-2012 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://sam.zoy.org/projects/COPYING.WTFPL for more details.
//

#if defined HAVE_CONFIG_H
# include "config.h"
#endif

#include "core.h"
#include "lol/unit.h"

namespace lol
{

LOLUNIT_FIXTURE(MapTest)
{
void SetUp() {}

void TearDown() {}

LOLUNIT_TEST(MapDeclare)
{
Map<uint8_t, uint8_t> m1;
Map<int, int> m2;
Map<float, float> m3;
Map<char const *, char const *> m4;
}

LOLUNIT_TEST(MapSet)
{
Map<int, int> map;

for (int i = 0; i < 100000; i++)
map[i] = -1;

for (int i = 0; i < 100000; i++)
map[i] = i;

for (int i = 0; i < 100000; i++)
LOLUNIT_ASSERT_EQUAL(map[i], i);
}

LOLUNIT_TEST(MapHasKey)
{
Map<int, int> map;

map[0] = 1;
map[2] = 2;

LOLUNIT_ASSERT(map.HasKey(0));
LOLUNIT_ASSERT(!map.HasKey(1));
LOLUNIT_ASSERT(map.HasKey(2));
}
};

} /* namespace lol */


Завантаження…
Відмінити
Зберегти