diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2018-06-10 05:25:53 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2018-06-10 05:25:53 +0800 |
commit | f02e5b8353a3a2ec8f729fa35bbfa71419f698ad (patch) | |
tree | a7ba16c792c7100b15b37bfe5a1cb213c4d2ce9a | |
parent | 6815f44866eb34b2b19f60f0f895de411ba94d2c (diff) | |
download | dexon-mcl-f02e5b8353a3a2ec8f729fa35bbfa71419f698ad.tar.gz dexon-mcl-f02e5b8353a3a2ec8f729fa35bbfa71419f698ad.tar.zst dexon-mcl-f02e5b8353a3a2ec8f729fa35bbfa71419f698ad.zip |
add FixedArray
-rw-r--r-- | include/mcl/array.hpp | 44 | ||||
-rw-r--r-- | test/array_test.cpp | 28 |
2 files changed, 72 insertions, 0 deletions
diff --git a/include/mcl/array.hpp b/include/mcl/array.hpp index 6e6f4c6..488a9fe 100644 --- a/include/mcl/array.hpp +++ b/include/mcl/array.hpp @@ -10,6 +10,7 @@ #include <stddef.h> namespace mcl { + template<class T> class Array { T *p_; @@ -80,5 +81,48 @@ public: T* data() { return p_; } const T* data() const { return p_; } }; + +template<class T, size_t maxSize> +class FixedArray { + T p_[maxSize]; + size_t n_; + FixedArray(const FixedArray&); + void operator=(const FixedArray&); + template<class U> + void swap_(U& x, U& y) const + { + U t; + t = x; + x = y; + y = t; + } +public: + FixedArray() : n_(0) {} + bool resize(size_t n) + { + if (n > maxSize) return false; + n_ = n; + return true; + } + bool copy(const FixedArray<T, maxSize>& rhs) + { + if (this == &rhs) return true; + for (size_t i = 0; i < rhs.n_; i++) { + p_[i] = rhs.p_[i]; + } + n_ = rhs.n_; + return true; + } + void clear() + { + n_ = 0; + } + size_t size() const { return n_; } + T& operator[](size_t n) { return p_[n]; } + const T& operator[](size_t n) const { return p_[n]; } + T* data() { return p_; } + const T* data() const { return p_; } +}; + } // mcl diff --git a/test/array_test.cpp b/test/array_test.cpp index 1a3a3e4..b0c3c16 100644 --- a/test/array_test.cpp +++ b/test/array_test.cpp @@ -30,3 +30,31 @@ CYBOZU_TEST_AUTO(resize) CYBOZU_TEST_EQUAL(b.size(), large); CYBOZU_TEST_EQUAL_ARRAY(a.data(), b.data(), small); } + +CYBOZU_TEST_AUTO(FixedArray) +{ + const size_t n = 5; + mcl::FixedArray<int, n> a, b; + CYBOZU_TEST_EQUAL(a.size(), 0); + CYBOZU_TEST_EQUAL(b.size(), 0); + + bool ok = a.resize(n); + CYBOZU_TEST_ASSERT(ok); + CYBOZU_TEST_EQUAL(n, a.size()); + for (size_t i = 0; i < n; i++) { + a[i] = i; + } + ok = b.copy(a); + CYBOZU_TEST_ASSERT(ok); + CYBOZU_TEST_EQUAL(b.size(), n); + CYBOZU_TEST_EQUAL_ARRAY(a.data(), b.data(), n); + + const size_t small = n - 1; + ok = b.resize(small); + CYBOZU_TEST_ASSERT(ok); + CYBOZU_TEST_EQUAL(b.size(), small); + CYBOZU_TEST_EQUAL_ARRAY(a.data(), b.data(), small); + const size_t large = n + 1; + ok = b.resize(large); + CYBOZU_TEST_ASSERT(!ok); +} |