aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2018-06-10 05:25:53 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2018-06-10 05:25:53 +0800
commitf02e5b8353a3a2ec8f729fa35bbfa71419f698ad (patch)
treea7ba16c792c7100b15b37bfe5a1cb213c4d2ce9a
parent6815f44866eb34b2b19f60f0f895de411ba94d2c (diff)
downloaddexon-mcl-f02e5b8353a3a2ec8f729fa35bbfa71419f698ad.tar.gz
dexon-mcl-f02e5b8353a3a2ec8f729fa35bbfa71419f698ad.tar.zst
dexon-mcl-f02e5b8353a3a2ec8f729fa35bbfa71419f698ad.zip
add FixedArray
-rw-r--r--include/mcl/array.hpp44
-rw-r--r--test/array_test.cpp28
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);
+}