summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2016-09-03 16:11:58 -0400
committer Nathan Woods <npwoods@mess.org>2016-09-03 16:11:58 -0400
commit4251194fe5b9f4d7551c362326e7ca20bc7da99b (patch)
treeb82bba2120de1fbfd16631b91ba8b479e2ccf9fe /src/lib
parentbe3c18302e117049c0f4c75f719afc3d3d69aa08 (diff)
Worked around the OPTION_GUIDE_EXTERN issue by using a crazy trick involving namespaces
Caveats: 1. Because of how this trick works, it is no longer possible to declare an option guide as static, so I had to make a bunch of changes 2. I'm going to want the hardcore C++ guys (i.e. - Vas) to review this with a fine toothed comb
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/formats/flopimg.cpp3
-rw-r--r--src/lib/util/opresolv.h27
2 files changed, 19 insertions, 11 deletions
diff --git a/src/lib/formats/flopimg.cpp b/src/lib/formats/flopimg.cpp
index e05bd54cf26..9fb487ba971 100644
--- a/src/lib/formats/flopimg.cpp
+++ b/src/lib/formats/flopimg.cpp
@@ -58,7 +58,7 @@ struct floppy_params
static floperr_t floppy_track_unload(floppy_image_legacy *floppy);
-OPTION_GUIDE_START(floppy_option_guide_actual)
+OPTION_GUIDE_START(floppy_option_guide)
OPTION_INT('H', "heads", "Heads")
OPTION_INT('T', "tracks", "Tracks")
OPTION_INT('S', "sectors", "Sectors")
@@ -66,7 +66,6 @@ OPTION_GUIDE_START(floppy_option_guide_actual)
OPTION_INT('I', "interleave", "Interleave")
OPTION_INT('F', "firstsectorid", "First Sector")
OPTION_GUIDE_END
-const util::option_guide &floppy_option_guide = floppy_option_guide_actual;
static void floppy_close_internal(floppy_image_legacy *floppy, int close_file);
diff --git a/src/lib/util/opresolv.h b/src/lib/util/opresolv.h
index 3d04f723840..3d919d26d59 100644
--- a/src/lib/util/opresolv.h
+++ b/src/lib/util/opresolv.h
@@ -50,19 +50,28 @@
// TYPE DEFINITIONS
//**************************************************************************
-#define OPTION_GUIDE_START(option_guide_) \
- const auto option_guide_ = util::make_option_guide(0
-#define OPTION_GUIDE_END \
- );
-#define OPTION_GUIDE_EXTERN(option_guide_) \
+#define OPTION_GUIDE_START(option_guide_) \
+ namespace option_guide_impl_##option_guide_ \
+ { \
+ static const util::option_guide &get(); \
+ }; \
+ const util::option_guide &option_guide_ = option_guide_impl_##option_guide_::get(); \
+ namespace option_guide_impl_##option_guide_ \
+ { \
+ static const auto actual = util::make_option_guide(0
+#define OPTION_GUIDE_END \
+ ); \
+ static const util::option_guide &get() { return actual; } \
+ };
+#define OPTION_GUIDE_EXTERN(option_guide_) \
extern const util::option_guide &option_guide_
-#define OPTION_INT(option_char, identifier, display_name) \
+#define OPTION_INT(option_char, identifier, display_name) \
,util::option_guide::entry(util::option_guide::entry::option_type::INT, (option_char), (identifier), (display_name))
-#define OPTION_STRING(option_char, identifier, display_name) \
+#define OPTION_STRING(option_char, identifier, display_name) \
,util::option_guide::entry(util::option_guide::entry::option_type::STRING, (option_char), (identifier), (display_name))
-#define OPTION_ENUM_START(option_char, identifier, display_name) \
+#define OPTION_ENUM_START(option_char, identifier, display_name) \
,util::option_guide::entry(util::option_guide::entry::option_type::ENUM_BEGIN, (option_char), (identifier), (display_name))
-#define OPTION_ENUM(value, identifier, display_name) \
+#define OPTION_ENUM(value, identifier, display_name) \
,util::option_guide::entry(util::option_guide::entry::option_type::ENUM_VALUE, (value), (identifier), (display_name))
#define OPTION_ENUM_END