Add attributes
This commit is contained in:
parent
475d310f67
commit
091a100f22
4 changed files with 90 additions and 0 deletions
27
examples/src/attributes.cpp
Normal file
27
examples/src/attributes.cpp
Normal file
|
@ -0,0 +1,27 @@
|
|||
#include <utempl/attributes.hpp>
|
||||
#include <string>
|
||||
|
||||
template <typename T>
|
||||
struct AttributeData {
|
||||
T value;
|
||||
};
|
||||
|
||||
|
||||
#define MY_ATTRIBUTE(type, ...) GENERIC_ATTRIBUTE(AttributeData<type>{__VA_ARGS__})
|
||||
|
||||
|
||||
ATTRIBUTE_STRUCT(SomeStruct,
|
||||
MY_ATTRIBUTE(int, .value = 2);
|
||||
int field;
|
||||
SKIP_ATTRIBUTE();
|
||||
int field2;
|
||||
MY_ATTRIBUTE(std::string, .value = "HEY!")
|
||||
std::string field3;
|
||||
);
|
||||
|
||||
static_assert(SomeStruct::GetAttribute<0>().value == 2);
|
||||
static_assert(SomeStruct::GetAttribute<2>().value == "HEY!");
|
||||
|
||||
|
||||
|
||||
auto main() -> int {};
|
5
examples/src/make.cpp
Normal file
5
examples/src/make.cpp
Normal file
|
@ -0,0 +1,5 @@
|
|||
#include <utempl/utils.hpp>
|
||||
|
||||
auto main() -> int {
|
||||
constexpr auto arr = utempl::TupleMaker<std::array<void*, 0>>::Make();
|
||||
};
|
48
include/utempl/attributes.hpp
Normal file
48
include/utempl/attributes.hpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include <utempl/loopholes/counter.hpp>
|
||||
#include <utempl/meta_info.hpp>
|
||||
|
||||
|
||||
namespace utempl {
|
||||
|
||||
|
||||
|
||||
namespace impl {
|
||||
|
||||
struct AttributesTag {};
|
||||
|
||||
template <typename T>
|
||||
struct AttributesCounterTag {};
|
||||
|
||||
|
||||
template <typename Current, auto f = []{}, auto = AddTypeToTag<impl::AttributesTag, Current, decltype(f)>()>
|
||||
struct CurrentSetter {};
|
||||
|
||||
|
||||
} // namespace impl
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define ATTRIBUTE_STRUCT(name, ...) struct name { \
|
||||
static_assert((::utempl::impl::CurrentSetter<name>(), true)); \
|
||||
template <std::size_t N> \
|
||||
static consteval auto GetAttribute(); __VA_ARGS__ }
|
||||
|
||||
struct NoInfo {};
|
||||
|
||||
#define GENERIC_ATTRIBUTE(value) \
|
||||
template <> \
|
||||
consteval auto GetAttribute< \
|
||||
::utempl::loopholes::Counter< \
|
||||
::utempl::impl::AttributesCounterTag<decltype(::utempl::GetCurrentTagType< \
|
||||
::utempl::impl::AttributesTag, \
|
||||
decltype([]{}) \
|
||||
>())::Type \
|
||||
>, \
|
||||
decltype([]{}) >()>() { return value; }
|
||||
|
||||
#define SKIP_ATTRIBUTE() GENERIC_ATTRIBUTE(::utempl::NoInfo{})
|
||||
|
||||
|
||||
} // namespace utempl
|
|
@ -70,6 +70,16 @@ consteval auto GetTypeListForTag() {
|
|||
return impl::GetTypeListForTag<Tag>(TypeList<Ts...>{});
|
||||
};
|
||||
|
||||
template <
|
||||
typename Tag,
|
||||
typename... Ts,
|
||||
auto I = utempl::loopholes::CountValue<Tag, Ts...>() - 1
|
||||
>
|
||||
consteval auto GetCurrentTagType() {
|
||||
return Magic(utempl::loopholes::Getter<MetaInfoKey<I, Tag>{}>());
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
static_assert(kTypeId<int> == 0);
|
||||
static_assert(kTypeId<void> == 1);
|
||||
|
|
Loading…
Reference in a new issue