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
|
// only needed for 'dump', which is a temporary debugging tool
#include <iostream>
#include <string>
// really needed
#include <stdint.h>
#include <vector>
template <typename PRIMITIVE>
class GrowableBuffer {
public:
void append(PRIMITIVE datum) {
data_.push_back(datum);
}
int64_t length() const {
return data_.size();
}
void dump() const {
for (auto x : data_) {
std::cout << x << " ";
}
}
private:
std::vector<PRIMITIVE> data_;
};
template <typename PRIMITIVE>
class NumpyLayoutBuilder {
public:
void append(PRIMITIVE x) {
data_.append(x);
}
int64_t length() const {
return data_.length();
}
void dump(std::string indent) const {
std::cout << indent << "NumpyLayoutBuilder" << std::endl;
std::cout << indent << " data ";
data_.dump();
std::cout << std::endl;
}
private:
GrowableBuffer<PRIMITIVE> data_;
};
template <typename INDEX, typename BUILDER>
class ListOffsetLayoutBuilder {
public:
ListOffsetLayoutBuilder() {
offsets_.append(0);
}
BUILDER* begin_list() {
return &content_;
}
void end_list() {
offsets_.append(content_.length());
}
void dump(std::string indent) const {
std::cout << indent << "ListOffsetLayoutBuilder" << std::endl;
std::cout << indent << " offsets ";
offsets_.dump();
std::cout << std::endl;
content_.dump(" ");
}
private:
GrowableBuffer<INDEX> offsets_;
BUILDER content_;
};
|