Empirical
ce_array.h
Go to the documentation of this file.
1 // This file is part of Empirical, https://github.com/devosoft/Empirical
2 // Copyright (C) Michigan State University, 2016.
3 // Released under the MIT Software license; see doc/LICENSE
4 //
5 //
6 // ce_string defines a limited array object for use within a constexpr class or function.
7 //
8 // STATUS: ALPHA
9 //
10 // Note: this class will be slow if used at run-time without conversion to an array or vector.
11 
12 #ifndef EMP_CE_ARRAY_H
13 #define EMP_CE_ARRAY_H
14 
15 #include <type_traits>
16 
17 #include "../base/assert.h"
18 
19 namespace emp {
20 
21  template <typename T, size_t N>
22  class ce_array {
23  private:
24  static constexpr size_t p1_size = N/2;
25  static constexpr size_t p2_size = N - p1_size;
26  ce_array<T, p1_size> p1; // First half of values.
27  ce_array<T, p2_size> p2; // Second half of values.
28 
29  public:
30  using value_type = T;
31 
32  constexpr ce_array(const T & default_val) : p1(default_val), p2(default_val) {;}
33  constexpr ce_array(const ce_array<T,N> & _in) : p1(_in.p1), p2(_in.p2) {;}
34 
35  constexpr void operator=(const ce_array<T,N> & _in) { p1 = _in.p1; p2 = _in.p2; }
36 
37  constexpr size_t size() const { return N; }
38  constexpr bool operator==(const ce_array<T,N> & _in) const {
39  return p1 == _in.p1 && p2 == _in.p2;
40  }
41  constexpr bool operator!=(const ce_array<T,N> & _in) const { return !operator==(_in); }
42 
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]; }
45 
46  constexpr T & back() { return p2.back(); }
47  constexpr const T & back() const { return p2.back(); }
48  constexpr void fill(const T & v) { p1.fill(v); p2.fill(v); }
49 
50  constexpr bool Has(const T & t) const { return p1.Has(t) || p2.Has(t); }
51 
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);
55  }
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);
59  }
60  };
61 
62  // Specialized version of ce_array for a single element.
63  template <typename T>
64  class ce_array<T,1> {
65  private:
66  T m_val; // Value at this position.
67  public:
68  using size_t = std::size_t;
69  using value_type = T;
70 
71  constexpr ce_array(const T & default_val) : m_val(default_val) {;}
72  constexpr ce_array(const ce_array<T,1> & _in) : m_val(_in.m_val) {;}
73 
74  constexpr void operator=(const ce_array<T,1> & _in) { m_val = _in.m_val; }
75 
76  constexpr size_t size() const { return 1; }
77  constexpr bool operator==(const ce_array<T,1> & _in) const { return m_val == _in.m_val; }
78  constexpr bool operator!=(const ce_array<T,1> & _in) const { return m_val != _in.m_val; }
79 
80  constexpr T & operator[](size_t id) { emp_assert(id==0); return m_val; }
81  constexpr const T & operator[](size_t id) const { emp_assert(id==0); return m_val; }
82 
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; }
86 
87  constexpr bool Has(const T & t) const { return m_val == t; }
88 
89  template <size_t i> constexpr T & Get() {
90  static_assert(i==0, "ce_array::Get<id> must have inded in range.");
91  return m_val;
92  }
93  template <size_t i> constexpr const T & Get() const {
94  static_assert(i==0, "ce_array::Get<id> must have inded in range.");
95  return m_val;
96  }
97  };
98 
99  // Specialized version of ce_array for an empty array.
100  template <typename T>
101  class ce_array<T,0> {
102  public:
103  using size_t = std::size_t;
104  using value_type = T;
105 
106  constexpr ce_array(const T &) {;}
107  constexpr ce_array(const ce_array<T,0> &) {;}
108 
109  constexpr void operator=(const ce_array<T,0> &) { ; }
110 
111  constexpr size_t size() const { return 0; }
112  constexpr bool operator==(const ce_array<T,0> &) const { return true; }
113  constexpr bool operator!=(const ce_array<T,0> &) const { return false; }
114 
115  // Cannot index into an empty array!
116  constexpr T & operator[](size_t id) { emp_assert(false); return *((T*) nullptr); }
117  constexpr const T & operator[](size_t id) const { emp_assert(false); return *((T*) nullptr); }
118 
119  // No back in an empty array.
120  constexpr T & back() { emp_assert(false); return *((T*) nullptr); }
121  constexpr const T & back() const { emp_assert(false); return *((T*) nullptr); }
122  constexpr void fill(const T &) { ; }
123 
124  constexpr bool Has(const T & t) const { return false; }
125  };
126 
127 }
128 
129 #endif
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