mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-29 13:29:46 +00:00
Starts experimenting with declared reflection.
This commit is contained in:
parent
5a8fcac4dc
commit
3428e9887d
52
Reflection/Struct.h
Normal file
52
Reflection/Struct.h
Normal file
@ -0,0 +1,52 @@
|
||||
//
|
||||
// Struct.h
|
||||
// Clock Signal
|
||||
//
|
||||
// Created by Thomas Harte on 06/03/2020.
|
||||
// Copyright © 2020 Thomas Harte. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef Struct_h
|
||||
#define Struct_h
|
||||
|
||||
#include <any>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
namespace Reflection {
|
||||
|
||||
class Struct {
|
||||
public:
|
||||
template <typename Type> const Type &get(const std::string &name) {
|
||||
return *std::any_cast<Type *>(contents_[name]);
|
||||
}
|
||||
|
||||
template <typename Type> void set(const std::string &name, const Type &value) {
|
||||
*std::any_cast<Type *>(contents_[name]) = value;
|
||||
}
|
||||
|
||||
const std::type_info &type_of(const std::string &name) {
|
||||
return contents_[name].type();
|
||||
}
|
||||
|
||||
std::vector<std::string> all_keys() {
|
||||
std::vector<std::string> keys;
|
||||
for(const auto &pair: contents_) {
|
||||
keys.push_back(pair.first);
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
|
||||
protected:
|
||||
template <typename Type> void declare(Type *t, const std::string &name) {
|
||||
contents_[name] = t;
|
||||
}
|
||||
|
||||
private:
|
||||
std::unordered_map<std::string, std::any> contents_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* Struct_h */
|
Loading…
Reference in New Issue
Block a user