Merge pull request #4092 from ab9rf/variant-identity

data identity changes for stl-variant in 50.12
develop
Myk 2023-12-10 18:13:46 -08:00 committed by GitHub
commit 7bb3b4809d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 18 deletions

@ -5,6 +5,7 @@
#include <mutex> #include <mutex>
#include <string> #include <string>
#include <vector> #include <vector>
#include <variant>
#include "DataFuncs.h" #include "DataFuncs.h"
#include "DataIdentity.h" #include "DataIdentity.h"
@ -17,9 +18,9 @@ namespace df {
category##_identity<type> identity_traits<type>::identity(name); category##_identity<type> identity_traits<type>::identity(name);
#define INTEGER_IDENTITY_TRAITS(type, name) NUMBER_IDENTITY_TRAITS(integer, type, name) #define INTEGER_IDENTITY_TRAITS(type, name) NUMBER_IDENTITY_TRAITS(integer, type, name)
#define FLOAT_IDENTITY_TRAITS(type) NUMBER_IDENTITY_TRAITS(float, type, #type) #define FLOAT_IDENTITY_TRAITS(type) NUMBER_IDENTITY_TRAITS(float, type, #type)
#define OPAQUE_IDENTITY_TRAITS_NAME(type, name) \ #define OPAQUE_IDENTITY_TRAITS_NAME(name, ...) \
opaque_identity identity_traits<type >::identity(sizeof(type), allocator_noassign_fn<type >, name) opaque_identity identity_traits<__VA_ARGS__ >::identity(sizeof(__VA_ARGS__), allocator_noassign_fn<__VA_ARGS__ >, name)
#define STL_OPAQUE_IDENTITY_TRAITS(type) OPAQUE_IDENTITY_TRAITS_NAME(std::type, #type) #define OPAQUE_IDENTITY_TRAITS(...) OPAQUE_IDENTITY_TRAITS_NAME(#__VA_ARGS__, __VA_ARGS__ )
INTEGER_IDENTITY_TRAITS(char, "char"); INTEGER_IDENTITY_TRAITS(char, "char");
INTEGER_IDENTITY_TRAITS(signed char, "int8_t"); INTEGER_IDENTITY_TRAITS(signed char, "int8_t");
@ -44,14 +45,13 @@ namespace df {
stl_bit_vector_identity identity_traits<std::vector<bool> >::identity; stl_bit_vector_identity identity_traits<std::vector<bool> >::identity;
bit_array_identity identity_traits<BitArray<int> >::identity; bit_array_identity identity_traits<BitArray<int> >::identity;
STL_OPAQUE_IDENTITY_TRAITS(condition_variable); OPAQUE_IDENTITY_TRAITS(std::condition_variable);
STL_OPAQUE_IDENTITY_TRAITS(fstream); OPAQUE_IDENTITY_TRAITS(std::fstream);
STL_OPAQUE_IDENTITY_TRAITS(mutex); OPAQUE_IDENTITY_TRAITS(std::mutex);
STL_OPAQUE_IDENTITY_TRAITS(future<void>); OPAQUE_IDENTITY_TRAITS(std::future<void>);
STL_OPAQUE_IDENTITY_TRAITS(function<void()>); OPAQUE_IDENTITY_TRAITS(std::function<void()>);
STL_OPAQUE_IDENTITY_TRAITS(optional<void_function>); OPAQUE_IDENTITY_TRAITS(std::optional<std::function<void()> >);
OPAQUE_IDENTITY_TRAITS_NAME(std::variant<std::string COMMA void_function>, OPAQUE_IDENTITY_TRAITS(std::variant<std::string, std::function<void()> >);
"variant<string, void_function>");
buffer_container_identity buffer_container_identity::base_instance; buffer_container_identity buffer_container_identity::base_instance;
} }

@ -33,6 +33,7 @@ distribution.
#include <unordered_map> #include <unordered_map>
#include <variant> #include <variant>
#include <vector> #include <vector>
#include <variant>
#include "DataDefs.h" #include "DataDefs.h"
@ -553,8 +554,8 @@ namespace df
// the space after the use of "type" in OPAQUE_IDENTITY_TRAITS is _required_ // the space after the use of "type" in OPAQUE_IDENTITY_TRAITS is _required_
// without it the macro generates a syntax error when type is a template specification // without it the macro generates a syntax error when type is a template specification
#define OPAQUE_IDENTITY_TRAITS(type) \ #define OPAQUE_IDENTITY_TRAITS(...) \
template<> struct DFHACK_EXPORT identity_traits<type > { \ template<> struct DFHACK_EXPORT identity_traits<__VA_ARGS__ > { \
static opaque_identity identity; \ static opaque_identity identity; \
static opaque_identity *get() { return &identity; } \ static opaque_identity *get() { return &identity; } \
}; };
@ -577,11 +578,8 @@ namespace df
OPAQUE_IDENTITY_TRAITS(std::mutex); OPAQUE_IDENTITY_TRAITS(std::mutex);
OPAQUE_IDENTITY_TRAITS(std::future<void>); OPAQUE_IDENTITY_TRAITS(std::future<void>);
OPAQUE_IDENTITY_TRAITS(std::function<void()>); OPAQUE_IDENTITY_TRAITS(std::function<void()>);
OPAQUE_IDENTITY_TRAITS(std::optional<std::function<void()> >);
typedef std::function<void()> void_function; OPAQUE_IDENTITY_TRAITS(std::variant<std::string, std::function<void()> >);
#define COMMA ,
OPAQUE_IDENTITY_TRAITS(std::optional<void_function>);
OPAQUE_IDENTITY_TRAITS(std::variant<std::string COMMA void_function>);
#ifdef BUILD_DFHACK_LIB #ifdef BUILD_DFHACK_LIB
template<typename T> template<typename T>