/******************************************************************************
Online C++ Compiler.
Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <iostream>
#include <vector>
using namespace std;
#define PRINT(x) ; Print(#x, ":", string(x))
template<typename T>
class TailArray{
protected:
int m_index;
std::vector<T> data;
protected:
TailArray(){}
public:
TailArray(int size){
data.resize(size);
m_index = 0;
};
T value(){
int index = m_index;
m_index = 0;
return data[index];
}
const T operator=(T value){
data[m_index] = (T)value;
m_index = 0;
return value;
};
};
template<typename T>
class NodeArray : public T{
protected:
int m_range;
protected:
NodeArray(){}
public:
NodeArray(const NodeArray &src){ this->operator=(src);}
template<typename T_int> NodeArray(T_int count, T_int r1) : T(count * r1), m_range(r1){}
template<typename T_int> NodeArray(T_int count, T_int r1, T_int r2) : T(count * r1, r2), m_range(r1){}
template<typename T_int> NodeArray(T_int count, T_int r1, T_int r2, T_int r3) : T(count * r1, r2, r3), m_range(r1){}
T& operator[](int index){
this->m_index = this->m_index * this->m_range + index;
return *this;
}
};
#define MultiArray(type, size) MultiArray##size(type)
#define MultiArray2(type) NodeArray<NodeArray<TailArray<type>>>
#define MultiArray3(type) NodeArray<NodeArray<NodeArray<TailArray<type>>>>
template<typename T>
class MultiArrayCreate{
public:
static MultiArray(T, 2) Size(int range_1, int range_2){
return (MultiArray(T, 2)(range_1, range_2, 1));
}
static MultiArray(T, 3) Size(int range_1, int range_2, int range_3){
return (MultiArray(T, 3)(range_1, range_2, range_3, 1));
}
};
void OnStart(){
MultiArray(int, 2) arr_2 = MultiArrayCreate<int>::Size(4, 4);
MultiArray(int, 3) arr_3 = MultiArrayCreate<int>::Size(4, 4, 4);
arr_2[0][0] = 2233;
arr_3[3][3][3] = 4455;
printf("%d\r\n", arr_2[0][0].value());
printf("%d\r\n", arr_3[3][3][3].value());
}
int main()
{
OnStart();
return 0;
}