@@ -14,19 +14,19 @@ void ArrayApplyImpl(std::array<T, N>&& args, F&& f,
1414}
1515
1616template <typename T, size_t N, typename F,
17- typename Indx = std::make_index_sequence<N> >
17+ typename Indx = std::make_index_sequence<N>>
1818void ArrayApply (std::array<T, N>&& args, F&& f) {
1919 return ArrayApplyImpl (std::move (args), f, Indx{});
2020}
2121
2222template <size_t ... Is, typename V>
23- std::array<V, sizeof ...(Is)> MakeArrayImpl (
23+ constexpr std::array<V, sizeof ...(Is)> MakeArrayImpl (
2424 V value, std::integer_sequence<size_t , Is...>) {
2525 return {((void )Is, value)...};
2626}
2727
2828template <size_t N, typename V>
29- std::array<V, N> MakeArray (V value) {
29+ constexpr std::array<V, N> MakeArray (V value) {
3030 return MakeArrayImpl (value, std::make_index_sequence<N>{});
3131}
3232
@@ -36,21 +36,24 @@ static constexpr T kDefault{};
3636template <typename T, size_t max_size>
3737class ArrayPrefix {
3838 public:
39- explicit ArrayPrefix (size_t size) : size_(size) { assert (size_ <= max_size); }
39+ constexpr ArrayPrefix (size_t size, T t)
40+ : size_(size), array_(MakeArray<max_size>(t)) {
41+ assert (size_ <= max_size);
42+ }
4043
41- ArrayPrefix (size_t size, T t ) : size_(size), array_(MakeArray<max_size>(t) ) {
44+ explicit constexpr ArrayPrefix (size_t size) : size_(size) {
4245 assert (size_ <= max_size);
4346 }
4447
45- template <typename Array>
46- explicit ArrayPrefix (Array&& array) : ArrayPrefix({}) {
48+ template <typename Array,
49+ typename = std::enable_if_t <!std::is_integral_v<Array>>>
50+ explicit constexpr ArrayPrefix (Array&& array) : ArrayPrefix({}) {
4751 for (const auto & v : array) {
48- array_[size_] = v;
49- size_++;
52+ push_back (v);
5053 }
5154 }
5255
53- ArrayPrefix (std::initializer_list<T> init)
56+ constexpr ArrayPrefix (std::initializer_list<T> init)
5457 : ArrayPrefix(init.size(), kDefault<T>) {
5558 assert (size_ <= max_size);
5659 std::copy (init.begin (), init.end (), begin ());
@@ -76,6 +79,10 @@ class ArrayPrefix {
7679 assert (index < size_);
7780 return array_[index];
7881 }
82+ void push_back (const T& t) {
83+ assert (size_ + 1 < max_size);
84+ array_[size_++] = t;
85+ }
7986 size_t size () const { return size_; }
8087
8188 private:
0 commit comments