mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-30 19:30:17 +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
|
#define Analyser_Static_Macintosh_Target_h
|
||||||
|
|
||||||
#include "../../../Reflection/Enum.h"
|
#include "../../../Reflection/Enum.h"
|
||||||
|
#include "../../../Reflection/Struct.h"
|
||||||
|
|
||||||
namespace Analyser {
|
namespace Analyser {
|
||||||
namespace Static {
|
namespace Static {
|
||||||
namespace Macintosh {
|
namespace Macintosh {
|
||||||
|
|
||||||
|
struct Target: public ::Analyser::Static::Target, public Reflection::Struct<Target> {
|
||||||
struct Target: public ::Analyser::Static::Target {
|
ReflectableEnum(Model, int, Mac128k, Mac512k, Mac512ke, MacPlus);
|
||||||
ReflectiveEnum(Model, int, Mac128k, Mac512k, Mac512ke, MacPlus);
|
|
||||||
|
|
||||||
Target() {
|
Target() {
|
||||||
// Model m;
|
// Boilerplate for declaring fields and potential values.
|
||||||
// printf("%s\n", __declaration(m));
|
if(needs_declare()) {
|
||||||
printf("%zu\n", Reflection::Enum<Model>::size());
|
declare(&model, "model");
|
||||||
// for(size_t c = 0; c < Reflection::Enum<Model>::size(); ++c) {
|
declare_enum(&model, EnumDeclaration(Model));
|
||||||
// const auto name = Reflection::Enum<Model>::toString(Model(c));
|
}
|
||||||
// printf("%.*s\n", int(name.size()), name.data());
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Model model = Model::MacPlus;
|
Model model = Model::MacPlus;
|
||||||
@ -37,5 +34,4 @@ struct Target: public ::Analyser::Static::Target {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* Analyser_Static_Macintosh_Target_h */
|
#endif /* Analyser_Static_Macintosh_Target_h */
|
||||||
|
@ -51,6 +51,9 @@ namespace {
|
|||||||
|
|
||||||
constexpr int CLOCK_RATE = 7833600;
|
constexpr int CLOCK_RATE = 7833600;
|
||||||
|
|
||||||
|
|
||||||
|
Analyser::Static::Macintosh::Target nothing;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Apple {
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
4B670A832401CB8400D4E002 /* z80memptr.tap */ = {isa = PBXFileReference; lastKnownFileType = file; path = z80memptr.tap; sourceTree = "<group>"; };
|
||||||
4B670A852401CB8400D4E002 /* z80ccf.tap */ = {isa = PBXFileReference; lastKnownFileType = file; path = z80ccf.tap; sourceTree = "<group>"; };
|
4B670A852401CB8400D4E002 /* z80ccf.tap */ = {isa = PBXFileReference; lastKnownFileType = file; path = z80ccf.tap; sourceTree = "<group>"; };
|
||||||
@ -2195,6 +2196,16 @@
|
|||||||
name = Concurrency;
|
name = Concurrency;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
4B3AF7CF2413470E00873C0B /* Reflection */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
4B3AF7D02413470E00873C0B /* Enum.h */,
|
||||||
|
4B3AF7D12413472200873C0B /* Struct.h */,
|
||||||
|
);
|
||||||
|
name = Reflection;
|
||||||
|
path = ../../Reflection;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
4B3BA0C41D318B44005DD7A7 /* Bridges */ = {
|
4B3BA0C41D318B44005DD7A7 /* Bridges */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -3247,7 +3258,6 @@
|
|||||||
4BB73E951B587A5100552FC2 = {
|
4BB73E951B587A5100552FC2 = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
4B644ED123FAF162006C0CC5 /* Enum.h */,
|
|
||||||
4BC76E6A1C98F43700E6EF73 /* Accelerate.framework */,
|
4BC76E6A1C98F43700E6EF73 /* Accelerate.framework */,
|
||||||
4B51F70820A521D700AFA2C1 /* Activity */,
|
4B51F70820A521D700AFA2C1 /* Activity */,
|
||||||
4B8944E2201967B4007DE474 /* Analyser */,
|
4B8944E2201967B4007DE474 /* Analyser */,
|
||||||
@ -3265,6 +3275,7 @@
|
|||||||
4B366DFD1B5C165F0026627B /* Outputs */,
|
4B366DFD1B5C165F0026627B /* Outputs */,
|
||||||
4BB73EDD1B587CA500552FC2 /* Processors */,
|
4BB73EDD1B587CA500552FC2 /* Processors */,
|
||||||
4BB73E9F1B587A5100552FC2 /* Products */,
|
4BB73E9F1B587A5100552FC2 /* Products */,
|
||||||
|
4B3AF7CF2413470E00873C0B /* Reflection */,
|
||||||
4B055A7B1FAE84A50060FFFF /* SDL */,
|
4B055A7B1FAE84A50060FFFF /* SDL */,
|
||||||
4B2409591C45DF85004DA684 /* SignalProcessing */,
|
4B2409591C45DF85004DA684 /* SignalProcessing */,
|
||||||
4B69FB391C4D908A00B5F0AA /* Storage */,
|
4B69FB391C4D908A00B5F0AA /* Storage */,
|
||||||
|
@ -10,9 +10,17 @@
|
|||||||
#define Enum_h
|
#define Enum_h
|
||||||
|
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace Reflection {
|
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 {
|
template <typename EnumType> struct Enum {
|
||||||
static size_t size() {
|
static size_t size() {
|
||||||
return members().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.
|
Enum members must take default values, and this enum must be in the global scope.
|
||||||
*/
|
*/
|
||||||
#define ReflectiveEnum(Name, Type, ...) \
|
//#define DefX #define X
|
||||||
enum class Name: Type { __VA_ARGS__ }; \
|
|
||||||
constexpr const char *__declaration(Name) { return #__VA_ARGS__; }
|
//#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 */
|
#endif /* Enum_h */
|
||||||
|
@ -57,6 +57,10 @@ template <typename Owner> class Struct {
|
|||||||
to determine whether a class of this type has already established the
|
to determine whether a class of this type has already established the
|
||||||
reflective fields.
|
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) {
|
template <typename Type> void declare(Type *t, const std::string &name) {
|
||||||
contents_.emplace(
|
contents_.emplace(
|
||||||
std::make_pair(
|
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
|
@returns @c true if this
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user