Add meta info and examples
This commit is contained in:
parent
777424069c
commit
7608faa225
7 changed files with 137 additions and 0 deletions
9
examples/src/curry.cpp
Normal file
9
examples/src/curry.cpp
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include <utempl/utils.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
auto main() -> int {
|
||||||
|
constexpr auto f = utempl::Curry([](auto... args){
|
||||||
|
return (0 + ... + args);
|
||||||
|
});
|
||||||
|
std::cout << f(1)(2)(3) << std::endl; // Call on cast to return type
|
||||||
|
};
|
13
examples/src/menu.cpp
Normal file
13
examples/src/menu.cpp
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#include <utempl/menu.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
auto main() -> int {
|
||||||
|
utempl::menu::Menu{}
|
||||||
|
.With<{"This is 0"}>([]{
|
||||||
|
std::cout << "You entered 0" << std::endl;
|
||||||
|
})
|
||||||
|
.With<{"Some Long", "S"}>([]{
|
||||||
|
std::cout << "It aligns the output to the longest element" << std::endl;
|
||||||
|
})
|
||||||
|
.Run<"[{0}]{2} - |{1}|\n">();
|
||||||
|
};
|
9
examples/src/meta.cpp
Normal file
9
examples/src/meta.cpp
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include <utempl/meta_info.hpp>
|
||||||
|
#include <array>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
auto main() -> int {
|
||||||
|
constexpr std::array types = {utempl::kTypeId<int>, utempl::kTypeId<void>};
|
||||||
|
static_assert(std::is_same_v<utempl::GetMetaInfo<types[0]>::Type, int>);
|
||||||
|
static_assert(std::is_same_v<utempl::GetMetaInfo<types[1]>::Type, void>);
|
||||||
|
};
|
13
examples/src/overloaded.cpp
Normal file
13
examples/src/overloaded.cpp
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#include <utempl/overloaded.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
auto main() -> int {
|
||||||
|
utempl::Overloaded(
|
||||||
|
[](auto&& arg){
|
||||||
|
},
|
||||||
|
[](int arg) {
|
||||||
|
std::cout << arg << std::endl;
|
||||||
|
}
|
||||||
|
)(42);
|
||||||
|
};
|
20
include/utempl/loopholes/core.hpp
Normal file
20
include/utempl/loopholes/core.hpp
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace utempl::loopholes {
|
||||||
|
|
||||||
|
template <auto I>
|
||||||
|
struct Getter {
|
||||||
|
friend constexpr auto Magic(Getter<I>);
|
||||||
|
};
|
||||||
|
template <auto I, auto Value = 0>
|
||||||
|
struct Injector {
|
||||||
|
friend constexpr auto Magic(Getter<I>) {return Value;};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <auto I, typename...>
|
||||||
|
concept Injected = requires{Magic(Getter<I>{});};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace utempl::loopholes
|
35
include/utempl/loopholes/counter.hpp
Normal file
35
include/utempl/loopholes/counter.hpp
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#pragma once
|
||||||
|
#include <utempl/loopholes/core.hpp>
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
namespace utempl::loopholes {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
template <typename Tag, auto Value>
|
||||||
|
struct TagWithTalue {};
|
||||||
|
|
||||||
|
template <auto I = 0, typename Tag, typename... Ts, auto = Injector<TagWithTalue<Tag, I>{}>{}>
|
||||||
|
constexpr auto Counter(...) {
|
||||||
|
return I;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <auto I = 0, typename Tag, typename... Ts>
|
||||||
|
consteval auto Counter(std::size_t arg) requires Injected<TagWithTalue<Tag, I>{}, Ts...> {
|
||||||
|
return Counter<I + 1, Tag, Ts...>(arg);
|
||||||
|
};
|
||||||
|
} // namespace impl;
|
||||||
|
|
||||||
|
// For incerement counter need a unique Ts...
|
||||||
|
template <
|
||||||
|
typename Tag,
|
||||||
|
typename... Ts,
|
||||||
|
auto R = impl::Counter<0, Tag, Ts...>(std::size_t{})
|
||||||
|
>
|
||||||
|
consteval auto Counter(auto...) {
|
||||||
|
return R;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace utempl::loopholes
|
38
include/utempl/meta_info.hpp
Normal file
38
include/utempl/meta_info.hpp
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#pragma once
|
||||||
|
#include <utempl/loopholes/counter.hpp>
|
||||||
|
#include <array>
|
||||||
|
#include <utempl/type_list.hpp>
|
||||||
|
|
||||||
|
namespace utempl {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
struct Types {};
|
||||||
|
} // namespace impl
|
||||||
|
|
||||||
|
|
||||||
|
template <std::size_t Id>
|
||||||
|
struct MetaInfoKey {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct MetaInfo {
|
||||||
|
static constexpr std::size_t kTypeId = loopholes::Counter<impl::Types, T>();
|
||||||
|
using Type = T;
|
||||||
|
private:
|
||||||
|
static constexpr auto _ = loopholes::Injector<MetaInfoKey<kTypeId>{}, TypeList<T>{}>{};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline constexpr std::size_t kTypeId = MetaInfo<T>::kTypeId;
|
||||||
|
|
||||||
|
template <std::size_t Id>
|
||||||
|
using GetMetaInfo = MetaInfo<typename decltype(Magic(loopholes::Getter<MetaInfoKey<Id>{}>{}))::Type>;
|
||||||
|
|
||||||
|
template <std::size_t Id>
|
||||||
|
using GetType = GetMetaInfo<Id>::Type;
|
||||||
|
|
||||||
|
} // namespace utempl
|
Loading…
Reference in a new issue