5 #ifndef MERCATOR_RANDCACHE_H
6 #define MERCATOR_RANDCACHE_H
12 #include <wfmath/MersenneTwister.h>
23 typedef WFMath::MTRand::uint32
uint32;
39 m_rand(seed), m_ordering(std::move(o)) {}
46 m_rand(seed, seed_len), m_ordering(std::move(o)) {}
55 size_type cache_order = (*m_ordering)(x, y);
58 if(cache_order >= m_cache.size()) {
60 m_cache.resize(cache_order + 64);
61 while(old_size < m_cache.size())
62 m_cache[old_size++] = m_rand.randInt();
65 return double(m_cache[cache_order] * (1.0/4294967295.0));
70 WFMath::MTRand m_rand;
72 std::vector<uint32> m_cache;
74 std::unique_ptr<Ordering> m_ordering;
83 if (x==0 && y==0)
return 0;
85 int d=std::max(std::abs(x), std::abs(y));
86 int min=(2*d-1)*(2*d-1);
88 if (y == d)
return min + 2*d - x;
89 if (x == -d)
return min + 4*d - y;
90 if (y == -d)
return min + 6*d + x;
92 if (y >=0)
return min + y;
93 else return min + 8*d + y;