-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrid.cc
136 lines (113 loc) · 3.04 KB
/
grid.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <iostream>
#include <string>
// ----------------------------TYPELIST-------------------------------------
class TypeNull {};
template <typename HEAD, typename TAIL>
struct TypeList {
typedef HEAD Head;
typedef TAIL Tail;
};
#define TYPELIST_1(T1) TypeList<T1, TypeNull>
#define TYPELIST_2(T1, T2) TypeList<T1, TYPELIST_1(T2) >
#define TYPELIST_3(T1, T2, T3) TypeList<T1, TYPELIST_2(T2, T3) >
enum ElemType {
INT,
FLOAT,
STRING,
DATE
};
// ----------------------------COLUMN-------------------------------------
template <size_t N, typename T>
struct Column {
typedef T ValueType;
size_t size() const { return N; }
std::string d_name;
ElemType d_type;
ValueType d_value[N];
};
// ----------------------------GRID-------------------------------------
template <size_t N, typename TL>
struct Grid {
typedef typename TL::Head ValueType;
typedef typename TL::Tail TypeList;
typedef Grid<N, TypeList> SubGrid;
typedef Column<N, ValueType> ColumnType;
ColumnType d_column;
SubGrid d_grid;
};
template <size_t N>
struct Grid<N, TypeNull> {
};
#define GRID_1(T1) Grid<1, TYPELIST_1(T1)>
#define GRID_2(T1, T2) Grid<2, TYPELIST_2(T1, T2)>
#define GRID_3(T1, T2, T3) Grid<3, TYPELIST_3(T1, T2, T3)>
// ----------------------------GRID GET COLUMN NUMBER-------------------
template <typename T>
struct ColumnLength;
template <template
<size_t, typename> class Grid, size_t N
>
struct ColumnLength <Grid<N, TypeNull> > {
enum { value = 0 };
};
template <template
<size_t, typename> class Grid, size_t N, typename TL
>
struct ColumnLength <Grid<N, TL> > {
enum { value = 1 + ColumnLength<Grid<N, typename TL::Tail> >::value };
};
// ----------------------------GRID PRINTER-------------------------------------
template <typename T>
struct Printer;
template <template
<size_t, typename> class Grid, size_t N
>
struct Printer <Grid<N, TypeNull> > {
void print(std::ostream& stream, const Grid<N, TypeNull>& grid) {}
};
template <template
<size_t, typename> class Grid, size_t N, typename TL
>
struct Printer <Grid<N, TL> > {
void print(std::ostream& stream, const Grid<N, TL>& grid)
{
typedef typename Grid<N, TL>::ColumnType ColumnType;
typedef typename Grid<N, TL>::SubGrid SubGrid;
const ColumnType &col = grid.d_column;
stream << "column name: " << col.d_name << '\n';
stream << "column data: [ ";
for (size_t i = 0; i != N; ++i) {
stream << col.d_value[i] << " ";
}
stream << "]\n";
Printer<SubGrid> printer;
printer.print(stream, grid.d_grid);
}
};
int main()
{
using namespace std;
typedef GRID_3(int, float, std::string) MyGrid;
cout << "Grid Row Number: ";
cout << ColumnLength<MyGrid>::value << '\n';
MyGrid grid = {
"number",
INT,
{1, 2, 3},
{
"price",
FLOAT,
{1.1, 2.2, 3.3},
{
{
"ticker",
STRING,
{"a", "b", "c"}
}
}
}
};
Printer<MyGrid> printer;
printer.print(std::cout, grid);
return 0;
}