Joedb 9.1.4
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Field.h
Go to the documentation of this file.
1#ifndef joedb_Field_declared
2#define joedb_Field_declared
3
4#include <vector>
5#include <algorithm>
6#include <variant>
7
8#include "joedb/Type.h"
9#include "joedb/index_types.h"
10
11namespace joedb
12{
13 /// @ingroup interpreted
14 class Field
15 {
16 private:
17 const Type type;
18
19 std::variant<std::monostate
20 #define TYPE_MACRO(cpp_type, return_type, type_id, R, W)\
21 , std::vector<cpp_type>
22 #include "joedb/TYPE_MACRO.h"
23 > column;
24
25 static constexpr size_t index(Record_Id record_id)
26 {
27 return to_underlying(record_id) - 1;
28 }
29
30 public:
31 Field(const Type &type, size_t size):
32 type(type)
33 {
34 switch (type.get_type_id())
35 {
36 case Type::Type_Id::null: break;
37 #define TYPE_MACRO(cpp_type, return_type, type_id, R, W)\
38 case Type::Type_Id::type_id:\
39 column.emplace<std::vector<cpp_type>>(size);\
40 break;
41 #include "joedb/TYPE_MACRO.h"
42 }
43 }
44
45 const Type &get_type() const {return type;}
46
47 void resize(size_t size)
48 {
49 switch (type.get_type_id())
50 {
51 case Type::Type_Id::null: break;
52 #define TYPE_MACRO(cpp_type, return_type, type_id, R, W)\
53 case Type::Type_Id::type_id:\
54 std::get<std::vector<cpp_type>>(column).resize(size);\
55 break;
56 #include "joedb/TYPE_MACRO.h"
57 }
58 }
59
60 #define TYPE_MACRO(cpp_type, return_type, type_id, R, W)\
61 return_type get_##type_id(Record_Id record_id) const\
62 {\
63 return std::get<std::vector<cpp_type>>(column)[index(record_id)];\
64 }\
65 void set_##type_id(Record_Id record_id, return_type value)\
66 {\
67 std::get<std::vector<cpp_type>>(column)[index(record_id)] = value;\
68 }\
69 const cpp_type *get_vector_##type_id() const\
70 {\
71 return &std::get<std::vector<cpp_type>>(column)[0];\
72 }\
73 void set_vector_##type_id(Record_Id record_id,\
74 size_t size,\
75 const cpp_type *value)\
76 {\
77 cpp_type *target =\
78 &std::get<std::vector<cpp_type>>(column)[index(record_id)];\
79 if (target != value)\
80 std::copy_n(value, size, target);\
81 }\
82 cpp_type *get_own_##type_id##_storage(Record_Id record_id)\
83 {\
84 return &std::get<std::vector<cpp_type>>(column)[index(record_id)];\
85 }\
86 const cpp_type *get_own_##type_id##_storage(Record_Id record_id) const\
87 {\
88 return &std::get<std::vector<cpp_type>>(column)[index(record_id)];\
89 }
90 #include "joedb/TYPE_MACRO.h"
91 };
92}
93
94#endif
void resize(size_t size)
Definition Field.h:47
Field(const Type &type, size_t size)
Definition Field.h:31
const Type & get_type() const
Definition Field.h:45
Type_Id get_type_id() const
Definition Type.h:40
Definition Blob.h:7
constexpr std::underlying_type< Table_Id >::type to_underlying(Table_Id id)
Definition index_types.h:15