diff --git a/upptst/SortedAMap/SortedAMap.upp b/upptst/SortedAMap/SortedAMap.upp new file mode 100644 index 000000000..f3e5f0133 --- /dev/null +++ b/upptst/SortedAMap/SortedAMap.upp @@ -0,0 +1,9 @@ +uses + Core; + +file + main.cpp; + +mainconfig + "" = "SSE2 IVTEST"; + diff --git a/upptst/SortedAMap/init b/upptst/SortedAMap/init new file mode 100644 index 000000000..4b1d0902d --- /dev/null +++ b/upptst/SortedAMap/init @@ -0,0 +1,4 @@ +#ifndef _SortedAMap_icpp_init_stub +#define _SortedAMap_icpp_init_stub +#include "Core/init" +#endif diff --git a/upptst/SortedAMap/main.cpp b/upptst/SortedAMap/main.cpp new file mode 100644 index 000000000..f613688a9 --- /dev/null +++ b/upptst/SortedAMap/main.cpp @@ -0,0 +1,211 @@ +#include + +using namespace Upp; + +template +void BenchNTL(const char *file, Stream& out) { + FileIn in(file); + if (!in) { + out << "Cannot open input file.\n"; + return; + } + + C map; + + for(;;) { + int c = in.Get(); + if(c < 0) break; + if(IsAlpha(c) || c == '_') { + String id; + id.Cat(c); + c = in.Get(); + while(c >= 0 && (IsAlNum(c) || c == '_')) { + id.Cat(c); + c = in.Get(); + } + map.GetAdd(id, 0)++; + } + else + if(IsDigit(c)) + do c = in.Get(); + while(c >= 0 && (IsAlNum(c) || c == '.')); + } + + for(int i = 0; i < map.GetCount(); i++) + out << ~map.GetKey(i) << ": " << map[i] << '\n'; +} + +void BenchNTL2(const char *file, Stream& out) { + FileIn in(file); + if (!in) { + out << "Cannot open input file.\n"; + return; + } + + VectorMap map; + + for(;;) { + int c = in.Get(); + if(c < 0) break; + if(IsAlpha(c) || c == '_') { + String id; + id.Cat(c); + c = in.Get(); + while(c >= 0 && (IsAlNum(c) || c == '_')) { + id.Cat(c); + c = in.Get(); + } + map.GetAdd(id, 0)++; + } + else + if(IsDigit(c)) + do c = in.Get(); + while(c >= 0 && (IsAlNum(c) || c == '.')); + } + + Vector order = GetSortOrder(map.GetKeys()); + for(int i = 0; i < order.GetCount(); i++) + out << ~map.GetKey(order[i]) << ": " << map[order[i]] << '\n'; +} + +void BenchmarkMap() +{ + String fn; + int argc = CommandLine().GetCount(); + const Vector& argv = CommandLine(); + if(argc < 1) +#ifdef _DEBUG + fn = GetDataFile("main.cpp"); +#else + fn = GetHomeDirFile("test.txt"); +#endif + else + fn = argv[0]; + + { + FileOut out(GetHomeDirFile("ntl1.txt")); + BenchNTL< SortedVectorMap >(fn, out); + } + + { + FileOut out(GetHomeDirFile("ntl2.txt")); + BenchNTL< SortedArrayMap >(fn, out); + } + + { + FileOut out(GetHomeDirFile("ntl3.txt")); + BenchNTL2(fn, out); + } + + ASSERT(LoadFile(GetHomeDirFile("ntl1.txt")) == LoadFile(GetHomeDirFile("ntl2.txt")) && + LoadFile(GetHomeDirFile("ntl2.txt")) == LoadFile(GetHomeDirFile("ntl3.txt"))); + LOG("MATCH!"); +} + +template +void Test(T& map) +{ + map.Add(1, 10); + map.Add(20, 20); + map.Add(12, 20); + map.Add(10, 11); + map.Add(12) = 21; + map.Add(1) = 2; + + map.GetAdd(12) = 1234; + + DUMPM(map); + + DUMP(map.FindAdd(4, 2)); + + DUMPM(map); + + map.GetAdd(13) = 1313; + + ASSERT(map.Get(13) == 1313); + ASSERT(map.Get(1) == 10); + ASSERT(map.Get(10) == 11); + ASSERT(map.GetAdd(10) == 11); + ASSERT(map.GetAdd(15, 4321) == 4321); + + for(int i = 0; i < 1000; i++) + map.Add(i, Random(1000)); + + for(int i = 0; i < 1000; i++) + map.FindAdd(i, Random(1000)); + + typename T::Iterator it = map.Begin(); + typename T::KeyConstIterator ckit = map.KeyBegin(); + typename T::ConstIterator cit = map.Begin(); + for(int i = 0; i < map.GetCount(); i++) { + ASSERT(map.GetKey(i) == *ckit++); + ASSERT(map[i] == *it++); + ASSERT(map[i] == *cit++); + + typename T::Iterator q = map.GetIter(i); + ASSERT(map[i] == *q); + typename T::KeyConstIterator kq = map.KeyGetIter(i); + ASSERT(map.GetKey(i) == *kq); + } +} + +CONSOLE_APP_MAIN +{ + StdLogSetup(LOG_COUT|LOG_FILE); + + BenchmarkMap(); + + LOG("==========================="); + LOG("VectorMap"); + SortedVectorMap map; + Test(map); + + LOG("==========================="); + LOG("ArrayMap"); + SortedArrayMap amap; + Test(amap); + + LOG("------------"); + + SortedArrayMap > am; + am.Add(1, 11); + am.Add(2) = 12; + am.Add(3, new int(13)); + am.Create(4) = 14; + am.GetAdd(5) = 15; + am.GetAdd(6, 0); + am.GetAdd(6, 1) = 16; + am.GetAdd(7, 17); + + DDUMPM(am); + + ASSERT(am.GetCount() == 7); + for(int i = 0; i < am.GetCount(); i++) { + ASSERT(am.GetKey(i) == am[i] - 10); + } + + am.Remove(0); + + DDUMPM(am); + + ASSERT(am.GetCount() == 6); + for(int i = 0; i < am.GetCount(); i++) + ASSERT(am.GetKey(i) + 1 == am[i] - 10 + 1); + + delete am.Detach(0); + + DDUMPM(am); + + ASSERT(am.GetCount() == 5); + for(int i = 0; i < am.GetCount(); i++) + ASSERT(am.GetKey(i) + 2 == am[i] - 10 + 2); + + RDUMP(sizeof(Vector)); + RDUMP(sizeof(Array)); + RDUMP(sizeof(Index)); + RDUMP(sizeof(VectorMap)); + RDUMP(sizeof(InVector)); + RDUMP(sizeof(InArray)); + RDUMP(sizeof(SortedIndex)); + RDUMP(sizeof(SortedVectorMap)); +}