//#pragma once
#include <array>
#include <initializer_list>
#include <algorithm>
template<class T,std::size_t N>
class ConstexprVector {
std::array<T, N> Buff{};
std::size_t C = 0;
public:
typedef T ValueType;
typedef typename std::array<T, N>::iterator Iterator;
typedef typename std::array<T, N>::const_iterator ConstIterator;
constexpr ConstexprVector(){};
constexpr explicit ConstexprVector(const std::initializer_list<T>& L){
std::size_t V = 0;
auto it1 = L.begin();
auto it2 = Buff.begin();
for (it1 ,it2 ; it1 != L.end() && it2 != Buff.end(); it1++, it2++) {
*it2 = *it1;
V++;
}
C = V;
}
constexpr std::size_t Size() const{
return C;
}
constexpr std::size_t MaxSize() const {
return N;
}
constexpr bool PushBack(const T& In) {
if (C >= Buff.size()) return false;
Buff[C] = In;
C++;
return true;
}
/** /
template<class... A>
constexpr bool EmplaceBack(const A& ...In) {
if (C >= Buff.size()) return false;
Buff[C] = T(In...);
C++;
return true;
}
/**/
constexpr bool PopBack() {
if (C == 0)return false;
//Buff[C]~T();
C--;
return true;
}
constexpr bool Clear() {
while (PopBack());
return true;
}
constexpr Iterator begin() {
return Buff.begin();
}
constexpr Iterator begin() const {
return Buff.begin();
}
constexpr Iterator end() {
return Buff.begin()+C;
}
constexpr Iterator end() const {
return Buff.begin()+C;
}
constexpr T& operator[](std::size_t idx) {
int A = 0;
if (Size() <= idx) A = 1/A;//kill?
return Buff[idx];
}
constexpr const T& operator[](std::size_t idx) const {
int A = 0;
if (Size() <= idx) A = 1/A;//kill?
return Buff[idx];
}
};
#include <iostream>
#include <cstdint>
//#include "ConstexprVector.h"
typedef ConstexprVector<std::uint64_t, 128> DType;
constexpr std::uint64_t Calc(const DType& D) {
std::uint64_t C = 0;
for (std::size_t i = 0; i < D.Size();i++) {
C += D[i];
}
return C;
}
int main() {
constexpr DType D{ 1,2,3,4,5 };
constexpr std::uint64_t R = Calc(D);
std::cout << R << std::endl;
return true;
}