|
@@ -8,23 +8,18 @@
|
|
|
#include <vector>
|
|
#include <vector>
|
|
|
#include <unordered_map>
|
|
#include <unordered_map>
|
|
|
|
|
|
|
|
-#include "utility/assert_utility.h"
|
|
|
|
|
-
|
|
|
|
|
namespace sophiar {
|
|
namespace sophiar {
|
|
|
|
|
|
|
|
struct sophiar_pool::impl {
|
|
struct sophiar_pool::impl {
|
|
|
|
|
|
|
|
struct variable_type_info {
|
|
struct variable_type_info {
|
|
|
- using creator_func_type = void *(*)(const nlohmann::json &);
|
|
|
|
|
-
|
|
|
|
|
- size_t binary_length;
|
|
|
|
|
std::type_index type = typeid(void);
|
|
std::type_index type = typeid(void);
|
|
|
|
|
+ variable_type_index_type type_index;
|
|
|
std::string type_name;
|
|
std::string type_name;
|
|
|
|
|
|
|
|
// function list
|
|
// function list
|
|
|
|
|
+ using creator_func_type = void *(*)(const nlohmann::json &);
|
|
|
creator_func_type creator_func;
|
|
creator_func_type creator_func;
|
|
|
- std::unordered_map<std::type_index, void *> writer_func_pool;
|
|
|
|
|
- std::unordered_map<std::type_index, void *> reader_func_pool;
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
struct variable_info_impl {
|
|
struct variable_info_impl {
|
|
@@ -34,7 +29,6 @@ namespace sophiar {
|
|
|
timestamp_type last_update_ts;
|
|
timestamp_type last_update_ts;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- using variable_type_index_type = uint16_t;
|
|
|
|
|
string_map<variable_type_index_type> variable_type_name_index_map; // typename -> index
|
|
string_map<variable_type_index_type> variable_type_name_index_map; // typename -> index
|
|
|
std::unordered_map<std::type_index, variable_type_index_type> variable_type_index_index_map; // type_index -> index
|
|
std::unordered_map<std::type_index, variable_type_index_type> variable_type_index_index_map; // type_index -> index
|
|
|
std::vector<variable_type_info> variable_type_info_pool;
|
|
std::vector<variable_type_info> variable_type_info_pool;
|
|
@@ -69,39 +63,10 @@ namespace sophiar {
|
|
|
variable_type_index_index_map[type] = var_type_index;
|
|
variable_type_index_index_map[type] = var_type_index;
|
|
|
|
|
|
|
|
auto &type_info = variable_type_info_pool[var_type_index];
|
|
auto &type_info = variable_type_info_pool[var_type_index];
|
|
|
- type_info.binary_length = SmallObjType::binary_length();
|
|
|
|
|
type_info.type = type;
|
|
type_info.type = type;
|
|
|
|
|
+ type_info.type_index = var_type_index;
|
|
|
type_info.type_name = type_name;
|
|
type_info.type_name = type_name;
|
|
|
type_info.creator_func = create_variable_pointer<SmallObjType>;
|
|
type_info.creator_func = create_variable_pointer<SmallObjType>;
|
|
|
-
|
|
|
|
|
- // create IO functions
|
|
|
|
|
-#define REGISTER_WRITER_FUNC(writer_type) { \
|
|
|
|
|
- const std::type_index writer_type_index = typeid(writer_type); \
|
|
|
|
|
- type_info.writer_func_pool[writer_type_index] = \
|
|
|
|
|
- (void *) &SmallObjType::template raw_pointer_write_to<writer_type>; }
|
|
|
|
|
-
|
|
|
|
|
- using writer_big_extern = versatile_writer<boost::endian::order::big>;
|
|
|
|
|
- using writer_little_extern = versatile_writer<boost::endian::order::little>;
|
|
|
|
|
- using writer_big_dynamic = dynamic_memory_writer<boost::endian::order::big>;
|
|
|
|
|
- using writer_little_dynamic = dynamic_memory_writer<boost::endian::order::little>;
|
|
|
|
|
-
|
|
|
|
|
- REGISTER_WRITER_FUNC(writer_big_extern)
|
|
|
|
|
- REGISTER_WRITER_FUNC(writer_little_extern)
|
|
|
|
|
- REGISTER_WRITER_FUNC(writer_big_dynamic)
|
|
|
|
|
- REGISTER_WRITER_FUNC(writer_little_dynamic)
|
|
|
|
|
-#undef REGISTER_WRITER_FUNC
|
|
|
|
|
-
|
|
|
|
|
-#define REGISTER_READER_FUNC(reader_type) { \
|
|
|
|
|
- const std::type_index reader_type_index = typeid(reader_type); \
|
|
|
|
|
- type_info.reader_func_pool[reader_type_index] = \
|
|
|
|
|
- (void *) &SmallObjType::template raw_pointer_fill_from<reader_type>; }
|
|
|
|
|
-
|
|
|
|
|
- using reader_big_extern = versatile_reader<boost::endian::order::big>;
|
|
|
|
|
- using reader_little_extern = versatile_reader<boost::endian::order::little>;
|
|
|
|
|
-
|
|
|
|
|
- REGISTER_READER_FUNC(reader_big_extern)
|
|
|
|
|
- REGISTER_READER_FUNC(reader_little_extern)
|
|
|
|
|
-#undef REGISTER_READER_FUNC
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void register_basic_variable_types() {
|
|
void register_basic_variable_types() {
|
|
@@ -109,21 +74,22 @@ namespace sophiar {
|
|
|
register_variable_type<var_type>(#var_type)
|
|
register_variable_type<var_type>(#var_type)
|
|
|
|
|
|
|
|
REGISTER_TYPE(bool_obj);
|
|
REGISTER_TYPE(bool_obj);
|
|
|
-// REGISTER_TYPE(u8int_obj);
|
|
|
|
|
-// REGISTER_TYPE(u16int_obj);
|
|
|
|
|
-// REGISTER_TYPE(u32int_obj);
|
|
|
|
|
REGISTER_TYPE(u64int_obj);
|
|
REGISTER_TYPE(u64int_obj);
|
|
|
-// REGISTER_TYPE(i8int_obj);
|
|
|
|
|
-// REGISTER_TYPE(i16int_obj);
|
|
|
|
|
-// REGISTER_TYPE(i32int_obj);
|
|
|
|
|
-// REGISTER_TYPE(i64int_obj);
|
|
|
|
|
-// REGISTER_TYPE(float_obj);
|
|
|
|
|
REGISTER_TYPE(double_obj);
|
|
REGISTER_TYPE(double_obj);
|
|
|
REGISTER_TYPE(scalarxyz_obj);
|
|
REGISTER_TYPE(scalarxyz_obj);
|
|
|
REGISTER_TYPE(transform_obj);
|
|
REGISTER_TYPE(transform_obj);
|
|
|
REGISTER_TYPE(array6_obj);
|
|
REGISTER_TYPE(array6_obj);
|
|
|
REGISTER_TYPE(array7_obj);
|
|
REGISTER_TYPE(array7_obj);
|
|
|
#undef REGISTER_TYPE
|
|
#undef REGISTER_TYPE
|
|
|
|
|
+
|
|
|
|
|
+ // check registered variable type index
|
|
|
|
|
+ assert(variable_type_index_index_map.at(typeid(bool_obj)) == bool_var_type_index);
|
|
|
|
|
+ assert(variable_type_index_index_map.at(typeid(u64int_obj)) == u64int_var_type_index);
|
|
|
|
|
+ assert(variable_type_index_index_map.at(typeid(double_obj)) == double_var_type_index);
|
|
|
|
|
+ assert(variable_type_index_index_map.at(typeid(scalarxyz_obj)) == scalarxyz_var_type_index);
|
|
|
|
|
+ assert(variable_type_index_index_map.at(typeid(transform_obj)) == transform_var_type_index);
|
|
|
|
|
+ assert(variable_type_index_index_map.at(typeid(array6_obj)) == array6_var_type_index);
|
|
|
|
|
+ assert(variable_type_index_index_map.at(typeid(array7_obj)) == array7_var_type_index);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void register_variable(std::string_view name,
|
|
void register_variable(std::string_view name,
|
|
@@ -186,9 +152,8 @@ namespace sophiar {
|
|
|
assert(pimpl->variable_pool.contains(var_name));
|
|
assert(pimpl->variable_pool.contains(var_name));
|
|
|
const auto &info = pimpl->variable_pool[var_name];
|
|
const auto &info = pimpl->variable_pool[var_name];
|
|
|
variable_info ret{
|
|
variable_info ret{
|
|
|
|
|
+ .var_type_index = info.type_info->type_index,
|
|
|
.var_index = pimpl->variable_pool.to_index_by_name(var_name),
|
|
.var_index = pimpl->variable_pool.to_index_by_name(var_name),
|
|
|
- .type = info.type_info->type,
|
|
|
|
|
- .binary_length = info.type_info->binary_length,
|
|
|
|
|
.placeholder = info.placeholder
|
|
.placeholder = info.placeholder
|
|
|
};
|
|
};
|
|
|
return ret;
|
|
return ret;
|
|
@@ -223,24 +188,6 @@ namespace sophiar {
|
|
|
info.update_signal->try_notify_all(ts);
|
|
info.update_signal->try_notify_all(ts);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void *sophiar_pool::require_raw_pointer_writer_impl(std::type_index writer_type,
|
|
|
|
|
- std::type_index var_type) {
|
|
|
|
|
- assert(pimpl->variable_type_index_index_map.contains(var_type));
|
|
|
|
|
- auto var_type_index = pimpl->variable_type_index_index_map[var_type];
|
|
|
|
|
- auto &info = pimpl->variable_type_info_pool[var_type_index];
|
|
|
|
|
- assert(info.writer_func_pool.contains(writer_type));
|
|
|
|
|
- return info.writer_func_pool[writer_type];
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- void *sophiar_pool::require_raw_pointer_reader_impl(std::type_index reader_type,
|
|
|
|
|
- std::type_index var_type) {
|
|
|
|
|
- assert(pimpl->variable_type_index_index_map.contains(var_type));
|
|
|
|
|
- auto var_type_index = pimpl->variable_type_index_index_map[var_type];
|
|
|
|
|
- auto &info = pimpl->variable_type_info_pool[var_type_index];
|
|
|
|
|
- assert(info.reader_func_pool.contains(reader_type));
|
|
|
|
|
- return info.reader_func_pool[reader_type];
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
void sophiar_pool::load_config(const nlohmann::json &config) {
|
|
void sophiar_pool::load_config(const nlohmann::json &config) {
|
|
|
pimpl->load_config(config);
|
|
pimpl->load_config(config);
|
|
|
}
|
|
}
|