12 #ifndef EMP_CE_ARRAY_H 13 #define EMP_CE_ARRAY_H 15 #include <type_traits> 17 #include "../base/assert.h" 21 template <
typename T,
size_t N>
24 static constexpr
size_t p1_size = N/2;
25 static constexpr
size_t p2_size = N - p1_size;
32 constexpr
ce_array(
const T & default_val) : p1(default_val), p2(default_val) {;}
37 constexpr
size_t size()
const {
return N; }
39 return p1 == _in.p1 && p2 == _in.p2;
43 constexpr T &
operator[](
size_t id) {
return (
id < p1_size) ? p1[id] : p2[
id-p1_size]; }
44 constexpr
const T &
operator[](
size_t id)
const {
return (
id < p1_size) ? p1[id] : p2[
id-p1_size]; }
47 constexpr
const T &
back()
const {
return p2.
back(); }
50 constexpr
bool Has(
const T & t)
const {
return p1.
Has(t) || p2.
Has(t); }
52 template <
size_t i> constexpr T &
Get() {
53 static_assert(i < N,
"ce_array::Get<id> must have inded in range.");
54 return (i < p1_size) ? p1.template Get<i>(0) : p2.template Get<i-p1_size>(0);
56 template <
size_t i> constexpr
const T &
Get()
const {
57 static_assert(i < N,
"ce_array::Get<id> must have inded in range.");
58 return (i < p1_size) ? p1.template Get<i>(0) : p2.template Get<i-p1_size>(0);
68 using size_t = std::size_t;
71 constexpr
ce_array(
const T & default_val) : m_val(default_val) {;}
76 constexpr
size_t size()
const {
return 1; }
83 constexpr T &
back() {
return m_val; }
84 constexpr
const T &
back()
const {
return m_val; }
85 constexpr
void fill(
const T & v) { m_val = v; }
87 constexpr
bool Has(
const T & t)
const {
return m_val == t; }
89 template <
size_t i> constexpr T &
Get() {
90 static_assert(i==0,
"ce_array::Get<id> must have inded in range.");
93 template <
size_t i> constexpr
const T &
Get()
const {
94 static_assert(i==0,
"ce_array::Get<id> must have inded in range.");
100 template <
typename T>
103 using size_t = std::size_t;
111 constexpr
size_t size()
const {
return 0; }
122 constexpr
void fill(
const T &) { ; }
124 constexpr
bool Has(
const T & t)
const {
return false; }
constexpr const T & back() const
Definition: ce_array.h:121
Definition: ce_array.h:101
constexpr ce_array(const ce_array< T, 1 > &_in)
Definition: ce_array.h:72
constexpr bool Has(const T &t) const
Definition: ce_array.h:124
constexpr bool Has(const T &t) const
Definition: ce_array.h:50
constexpr const T & operator[](size_t id) const
Definition: ce_array.h:44
constexpr bool operator==(const ce_array< T, 1 > &_in) const
Definition: ce_array.h:77
constexpr size_t size() const
Definition: ce_array.h:111
constexpr bool operator!=(const ce_array< T, 1 > &_in) const
Definition: ce_array.h:78
constexpr void operator=(const ce_array< T, N > &_in)
Definition: ce_array.h:35
constexpr size_t size() const
Definition: ce_array.h:37
constexpr const T & operator[](size_t id) const
Definition: ce_array.h:117
constexpr ce_array(const T &default_val)
Definition: ce_array.h:32
constexpr T & back()
Definition: ce_array.h:120
constexpr void fill(const T &)
Definition: ce_array.h:122
constexpr ce_array(const ce_array< T, 0 > &)
Definition: ce_array.h:107
constexpr bool operator==(const ce_array< T, 0 > &) const
Definition: ce_array.h:112
constexpr T & Get()
Definition: ce_array.h:89
constexpr const T & back() const
Definition: ce_array.h:84
constexpr const T & Get() const
Definition: ce_array.h:93
constexpr T & back()
Definition: ce_array.h:83
constexpr bool operator==(const ce_array< T, N > &_in) const
Definition: ce_array.h:38
constexpr bool operator!=(const ce_array< T, N > &_in) const
Definition: ce_array.h:41
Definition: ce_array.h:64
constexpr T & operator[](size_t id)
Definition: ce_array.h:80
constexpr ce_array(const T &default_val)
Definition: ce_array.h:71
constexpr T & operator[](size_t id)
Definition: ce_array.h:116
constexpr ce_array(const ce_array< T, N > &_in)
Definition: ce_array.h:33
constexpr T & Get()
Definition: ce_array.h:52
constexpr const T & Get() const
Definition: ce_array.h:56
constexpr T & operator[](size_t id)
Definition: ce_array.h:43
constexpr const T & operator[](size_t id) const
Definition: ce_array.h:81
constexpr size_t size() const
Definition: ce_array.h:76
constexpr void fill(const T &v)
Definition: ce_array.h:85
If we are in emscripten, make sure to include the header.
Definition: array.h:37
constexpr T & back()
Definition: ce_array.h:46
constexpr const T & back() const
Definition: ce_array.h:47
constexpr bool Has(const T &t) const
Definition: ce_array.h:87
#define emp_assert(...)
Definition: assert.h:199
T value_type
Definition: ce_array.h:104
constexpr ce_array(const T &)
Definition: ce_array.h:106
constexpr void operator=(const ce_array< T, 0 > &)
Definition: ce_array.h:109
T value_type
Definition: ce_array.h:69
constexpr void fill(const T &v)
Definition: ce_array.h:48
constexpr bool operator!=(const ce_array< T, 0 > &) const
Definition: ce_array.h:113
T value_type
Definition: ce_array.h:30
Definition: ce_array.h:22
constexpr void operator=(const ce_array< T, 1 > &_in)
Definition: ce_array.h:74