mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-28 07:29:45 +00:00
Starts working towards a registration-based model of reflective enums.
This commit is contained in:
parent
a99bb3ba6d
commit
ce80825abb
@ -10,24 +10,21 @@
|
||||
#define Analyser_Static_Macintosh_Target_h
|
||||
|
||||
#include "../../../Reflection/Enum.h"
|
||||
|
||||
#include "../../../Reflection/Struct.h"
|
||||
|
||||
namespace Analyser {
|
||||
namespace Static {
|
||||
namespace Macintosh {
|
||||
|
||||
|
||||
struct Target: public ::Analyser::Static::Target {
|
||||
ReflectiveEnum(Model, int, Mac128k, Mac512k, Mac512ke, MacPlus);
|
||||
struct Target: public ::Analyser::Static::Target, public Reflection::Struct<Target> {
|
||||
ReflectableEnum(Model, int, Mac128k, Mac512k, Mac512ke, MacPlus);
|
||||
|
||||
Target() {
|
||||
// Model m;
|
||||
// printf("%s\n", __declaration(m));
|
||||
printf("%zu\n", Reflection::Enum<Model>::size());
|
||||
// for(size_t c = 0; c < Reflection::Enum<Model>::size(); ++c) {
|
||||
// const auto name = Reflection::Enum<Model>::toString(Model(c));
|
||||
// printf("%.*s\n", int(name.size()), name.data());
|
||||
// }
|
||||
// Boilerplate for declaring fields and potential values.
|
||||
if(needs_declare()) {
|
||||
declare(&model, "model");
|
||||
declare_enum(&model, EnumDeclaration(Model));
|
||||
}
|
||||
}
|
||||
|
||||
Model model = Model::MacPlus;
|
||||
@ -37,5 +34,4 @@ struct Target: public ::Analyser::Static::Target {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif /* Analyser_Static_Macintosh_Target_h */
|
||||
|
@ -51,6 +51,9 @@ namespace {
|
||||
|
||||
constexpr int CLOCK_RATE = 7833600;
|
||||
|
||||
|
||||
Analyser::Static::Macintosh::Target nothing;
|
||||
|
||||
}
|
||||
|
||||
namespace Apple {
|
||||
|
@ -1040,6 +1040,8 @@
|
||||
4B38F3471F2EC11D00D9235D /* AmstradCPC.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = AmstradCPC.hpp; path = AmstradCPC/AmstradCPC.hpp; sourceTree = "<group>"; };
|
||||
4B3940E51DA83C8300427841 /* AsyncTaskQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AsyncTaskQueue.cpp; path = ../../Concurrency/AsyncTaskQueue.cpp; sourceTree = "<group>"; };
|
||||
4B3940E61DA83C8300427841 /* AsyncTaskQueue.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = AsyncTaskQueue.hpp; path = ../../Concurrency/AsyncTaskQueue.hpp; sourceTree = "<group>"; };
|
||||
4B3AF7D02413470E00873C0B /* Enum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Enum.h; sourceTree = "<group>"; };
|
||||
4B3AF7D12413472200873C0B /* Struct.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Struct.h; sourceTree = "<group>"; };
|
||||
4B3BA0C21D318AEB005DD7A7 /* C1540Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = C1540Tests.swift; sourceTree = "<group>"; };
|
||||
4B3BA0C51D318B44005DD7A7 /* C1540Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = C1540Bridge.h; sourceTree = "<group>"; };
|
||||
4B3BA0C61D318B44005DD7A7 /* C1540Bridge.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = C1540Bridge.mm; sourceTree = "<group>"; };
|
||||
@ -1138,7 +1140,6 @@
|
||||
4B643F3C1D77AE5C00D431D6 /* CSMachine+Target.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CSMachine+Target.h"; sourceTree = "<group>"; };
|
||||
4B643F3E1D77B88000D431D6 /* DocumentController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DocumentController.swift; sourceTree = "<group>"; };
|
||||
4B644ED023F0FB55006C0CC5 /* ScanSynchroniser.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ScanSynchroniser.hpp; sourceTree = "<group>"; };
|
||||
4B644ED123FAF162006C0CC5 /* Enum.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Enum.h; path = ../../Reflection/Enum.h; sourceTree = "<group>"; };
|
||||
4B65085F22F4CF8D009C1100 /* Keyboard.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Keyboard.cpp; sourceTree = "<group>"; };
|
||||
4B670A832401CB8400D4E002 /* z80memptr.tap */ = {isa = PBXFileReference; lastKnownFileType = file; path = z80memptr.tap; sourceTree = "<group>"; };
|
||||
4B670A852401CB8400D4E002 /* z80ccf.tap */ = {isa = PBXFileReference; lastKnownFileType = file; path = z80ccf.tap; sourceTree = "<group>"; };
|
||||
@ -2195,6 +2196,16 @@
|
||||
name = Concurrency;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4B3AF7CF2413470E00873C0B /* Reflection */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4B3AF7D02413470E00873C0B /* Enum.h */,
|
||||
4B3AF7D12413472200873C0B /* Struct.h */,
|
||||
);
|
||||
name = Reflection;
|
||||
path = ../../Reflection;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4B3BA0C41D318B44005DD7A7 /* Bridges */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -3247,7 +3258,6 @@
|
||||
4BB73E951B587A5100552FC2 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4B644ED123FAF162006C0CC5 /* Enum.h */,
|
||||
4BC76E6A1C98F43700E6EF73 /* Accelerate.framework */,
|
||||
4B51F70820A521D700AFA2C1 /* Activity */,
|
||||
4B8944E2201967B4007DE474 /* Analyser */,
|
||||
@ -3265,6 +3275,7 @@
|
||||
4B366DFD1B5C165F0026627B /* Outputs */,
|
||||
4BB73EDD1B587CA500552FC2 /* Processors */,
|
||||
4BB73E9F1B587A5100552FC2 /* Products */,
|
||||
4B3AF7CF2413470E00873C0B /* Reflection */,
|
||||
4B055A7B1FAE84A50060FFFF /* SDL */,
|
||||
4B2409591C45DF85004DA684 /* SignalProcessing */,
|
||||
4B69FB391C4D908A00B5F0AA /* Storage */,
|
||||
|
@ -10,9 +10,17 @@
|
||||
#define Enum_h
|
||||
|
||||
#include <cctype>
|
||||
#include <string>
|
||||
|
||||
namespace Reflection {
|
||||
|
||||
#define ReflectableEnum(Name, Type, ...) \
|
||||
enum class Name: Type { Mac128k, Mac512k, Mac512ke, MacPlus }; \
|
||||
constexpr static const char *__declaration##Name = #__VA_ARGS__;
|
||||
|
||||
#define EnumDeclaration(Name) __declaration##Name
|
||||
|
||||
|
||||
template <typename EnumType> struct Enum {
|
||||
static size_t size() {
|
||||
return members().size();
|
||||
@ -69,8 +77,16 @@ template <typename EnumType> struct Enum {
|
||||
|
||||
Enum members must take default values, and this enum must be in the global scope.
|
||||
*/
|
||||
#define ReflectiveEnum(Name, Type, ...) \
|
||||
enum class Name: Type { __VA_ARGS__ }; \
|
||||
constexpr const char *__declaration(Name) { return #__VA_ARGS__; }
|
||||
//#define DefX #define X
|
||||
|
||||
//#define ForwardDeclareReflectiveEnum(Namespace, Name, ...) \
|
||||
// #define HAT
|
||||
|
||||
// DeclName(m) m(__VA_ARGS__)
|
||||
|
||||
// constexpr const char *__declaration(Namespace::Name) { return __VA_ARGS__; }
|
||||
|
||||
//#define DefineReflectiveEnum(Name, Type) \
|
||||
// enum class Name: Type { Mac128k, Mac512k, Mac512ke, MacPlus };
|
||||
|
||||
#endif /* Enum_h */
|
||||
|
@ -57,6 +57,10 @@ template <typename Owner> class Struct {
|
||||
to determine whether a class of this type has already established the
|
||||
reflective fields.
|
||||
*/
|
||||
|
||||
/*!
|
||||
Exposes the field pointed to by @c t for reflection as @c name.
|
||||
*/
|
||||
template <typename Type> void declare(Type *t, const std::string &name) {
|
||||
contents_.emplace(
|
||||
std::make_pair(
|
||||
@ -65,6 +69,14 @@ template <typename Owner> class Struct {
|
||||
));
|
||||
}
|
||||
|
||||
/*!
|
||||
Provides the original declaration of an enum.
|
||||
*/
|
||||
template <typename Type> void declare_enum(Type *t, const char *declaration) {
|
||||
// TODO: something.
|
||||
printf("%s\n", declaration);
|
||||
}
|
||||
|
||||
/*!
|
||||
@returns @c true if this
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user