VapourSynth-llvmexpr
Loading...
Searching...
No Matches
StandardLibrary.hpp
Go to the documentation of this file.
1
19
20#ifndef LLVMEXPR_FRONTEND_INFIX2POSTFIX_STANDARDLIBRARY_HPP
21#define LLVMEXPR_FRONTEND_INFIX2POSTFIX_STANDARDLIBRARY_HPP
22
23// Import all standard library definitions
24#include "stdlib/Algorithms.hpp"
26#include "stdlib/Meta.hpp"
27#include "stdlib/Std.hpp"
28
29#include <optional>
30#include <string_view>
31#include <type_traits>
32#include <vector>
33
34namespace infix2postfix {
35
38
40 std::tuple<stdlib::Algorithms, stdlib::Meta, stdlib::Std>;
41
42namespace detail {
43
44template <typename T, typename Tuple> struct tuple_contains;
45
46template <typename T, typename... Us>
47struct tuple_contains<T, std::tuple<Us...>>
48 : std::bool_constant<(std::is_same_v<T, Us> || ...)> {};
49
50template <typename T, typename Tuple>
52
53template <typename Tuple, typename T> struct TuplePushFront {
54 using type =
55 decltype(std::tuple_cat(std::tuple<T>{}, std::declval<Tuple>()));
56};
57
58template <typename Lib, typename Resolved> struct AppendIfAbsent {
59 using type =
60 std::conditional_t<TUPLE_CONTAINS_V<Lib, Resolved>, Resolved,
61 decltype(std::tuple_cat(std::declval<Resolved>(),
62 std::tuple<Lib>{}))>;
63};
64
65template <typename DepTuple, typename RecStack, typename Resolved>
67
68template <IsLibrary Lib, typename RecStack, typename Resolved>
69struct ResolveOne; // Forward declaration
70
71template <IsLibrary Dep, typename... Deps, typename RecStack, typename Resolved>
72struct resolve_deps<std::tuple<Dep, Deps...>, RecStack, Resolved> {
74 using type =
75 typename resolve_deps<std::tuple<Deps...>, RecStack, after_first>::type;
76};
77
78template <typename RecStack, typename Resolved>
79struct resolve_deps<std::tuple<>, RecStack, Resolved> {
80 using type = Resolved;
81};
82
83template <IsLibrary Lib, typename RecStack, typename Resolved>
84struct ResolveOne {
86 "Circular dependency detected in standard libraries");
87
89 using after_deps =
92};
93
94} // namespace detail
95
96template <IsLibrary Lib>
98 typename detail::ResolveOne<Lib, std::tuple<>, std::tuple<>>::type;
99
101 public:
102 static std::vector<std::string_view>
103 resolveDependencies(std::string_view library_name);
104
105 static std::optional<std::string_view>
106 getLibraryCode(std::string_view library_name);
107
108 static std::optional<std::vector<ExportedFunction>>
109 getExports(std::string_view library_name);
110};
111
112} // namespace infix2postfix
113
114#endif // LLVMEXPR_FRONTEND_INFIX2POSTFIX_STANDARDLIBRARY_HPP
static std::optional< std::string_view > getLibraryCode(std::string_view library_name)
static std::optional< std::vector< ExportedFunction > > getExports(std::string_view library_name)
static std::vector< std::string_view > resolveDependencies(std::string_view library_name)
constexpr bool TUPLE_CONTAINS_V
std::tuple< stdlib::Algorithms, stdlib::Meta, stdlib::Std > AllStandardLibraries
typename detail::ResolveOne< Lib, std::tuple<>, std::tuple<> >::type ResolveLibraryDependencies
std::conditional_t< TUPLE_CONTAINS_V< Lib, Resolved >, Resolved, decltype(std::tuple_cat(std::declval< Resolved >(), std::tuple< Lib >{}))> type
typename resolve_deps< typename Lib::dependencies, rec2, Resolved >::type after_deps
typename TuplePushFront< RecStack, Lib >::type rec2
typename AppendIfAbsent< Lib, after_deps >::type type
decltype(std::tuple_cat(std::tuple< T >{}, std::declval< Tuple >())) type
typename resolve_deps< std::tuple< Deps... >, RecStack, after_first >::type type