7#ifndef ARCANE_SERVICE_OPTIONS_H
8#define ARCANE_SERVICE_OPTIONS_H
21namespace StrongOptions
23template <
typename T, std::
size_t N>
24std::ostream& operator<<(std::ostream& o,
const std::array<T, N>& a)
32std::ostream& operator<<(std::ostream& o,
const std::vector<T>& a)
41template <std::size_t... Is>
struct seq
43template <std::size_t N, std::size_t... Is>
46template <std::size_t... Is>
50template <
typename T, std::size_t N1, std::size_t... I1, std::size_t N2, std::size_t... I2>
55 return std::array<T, N1 + N2>{ { a1[I1] }..., { a2[I2] }... };
58template <
typename T, std::
size_t N1, std::
size_t N2>
61concat(
const std::array<T, N1>& a1,
const std::array<T, N2>& a2)
66template <
typename T, std::
size_t N1>
69concat(
const std::array<T, N1>& a1,
const T& x)
80 template <
typename T,
int N,
typename... Args>
81 static std::array<typename T::type, N>
82 requiredFixedArray(Args&&... args)
87 template <
typename T,
int N,
int CurN,
typename... Args>
91 template <
typename T,
int N,
int CurN,
typename Head,
typename... Tail>
94 static std::array<typename T::type, N>
95 requiredFixedArray(
const std::array<typename T::type, CurN>& r, Head&&, Tail&&... args)
101 template <
typename T,
int N,
int CurN,
typename... Tail>
104 static std::array<typename T::type, N>
105 requiredFixedArray(
const std::array<typename T::type, CurN>& r, T&& t, Tail&&... args)
111 template <
typename T,
int N,
int CurN>
114 static std::array<typename T::type, N>
115 requiredFixedArray(
const std::array<typename T::type, CurN>& r)
117 static_assert(CurN == N,
"Invalid required parameter count");
166 template <
typename T,
int Nmin,
int Nmax,
typename... Args>
168 requiredVariableArray(Args&&... args)
173 template <
typename T,
int Nmin,
int Nmax,
int CurN,
typename... Args>
177 template <
typename T,
int Nmin,
int Nmax,
int CurN,
typename Head,
typename... Tail>
188 template <
typename T,
int Nmin,
int Nmax,
int CurN,
typename... Tail>
199 template <
typename T,
int Nmin,
int Nmax,
int CurN>
205 static_assert(CurN >= Nmin && (Nmax == -1 || CurN <= Nmax),
"Invalid required parameter count");
211 template <
typename T,
typename... Args>
213 optionalSimple(
typename T::type& r, Args&&... args)
218 template <
typename T,
int CurN,
typename... Args>
222 template <
typename T,
int CurN,
typename Head,
typename... Tail>
226 optionalSimple(
typename T::type& r, Head&&, Tail&&... args)
232 template <
typename T,
int CurN,
typename... Tail>
236 optionalSimple(
typename T::type& r, T&& t, Tail&&... args)
243 template <
typename T,
int CurN>
247 optionalSimple([[maybe_unused]]
typename T::type& r)
249 static_assert(CurN <= 1,
"Invalid required parameter count");
255 template <
typename AllowedTypes,
typename... Args>
257 checkRestriction(
const Args&... args)
262 template <
typename AllowedTypes,
typename... Args>
266 template <
typename... AllowedTypes,
typename Head,
typename... Tail>
267 struct Internal4<std::tuple<AllowedTypes...>, Head, Tail...>
270 checkRestriction([[maybe_unused]]
const Head& h,
const Tail&... tail)
272 static_assert(
Internal44<Head, AllowedTypes...>::checkType,
"Illegal option");
273 return Internal4<std::tuple<AllowedTypes...>, Tail...>::checkRestriction(tail...);
277 template <
typename... AllowedTypes>
287 template <
typename Arg,
typename... AllowedTypes>
291 template <
typename Arg,
typename Head,
typename... Tail>
297 template <
typename Arg,
typename Head>
300 static const bool checkType = std::is_same<Arg, Head>::value;
303 template <
typename Arg>
306 static const bool checkType =
false;
312template <
typename Name,
typename Type>
323template <
typename Name,
typename Type>
336#define DECLARE_OPTION_EXTERN(name, type) \
341 typedef OptionValue<tag::name##_t, type> name##_; \
342 ARCANE_CORE_EXPORT extern OptionProxy<tag::name##_t, type> _##name;
344#define DECLARE_OPTION(name, type) \
349 typedef OptionValue<tag::name##_t, type> name##_; \
350 OptionProxy<tag::name##_t, type> _##name;
354#if !defined(ARCANE_JOIN_HELPER2)
355#define ARCANE_JOIN_HELPER2(a, b) a##b
358#if !defined(ARCANE_JOIN_HELPER)
359#define ARCANE_JOIN_HELPER(a, b) ARCANE_JOIN_HELPER2(a, b)
362#if !defined(ARCANE_JOIN_WITH_LINE)
363#define ARCANE_JOIN_WITH_LINE(a) ARCANE_JOIN_HELPER(a, __LINE__)
369template <
typename Interface>
374 static std::unique_ptr<Interface>
375 create(
const std::string& name)
377 const std::map<std::string, ctor_functor>& ctor_functors = instance()->m_ctor_functors;
378 auto finder = ctor_functors.find(name);
381 return std::unique_ptr<Interface>(finder->second());
386 typedef std::function<Interface*()> ctor_functor;
389 registerImplementation(
const std::string& name,
const ctor_functor& ctor)
391 instance()->m_ctor_functors[name] = ctor;
396 static std::unique_ptr<InstanceBuilder> m_instance;
402 return m_instance.get();
407 std::map<std::string, ctor_functor> m_ctor_functors;
413template <
typename Interface,
typename Class,
typename SrongOptionClass>
414struct InstanceRegisterer
416 InstanceRegisterer(
const std::string& name)
418 InstanceBuilder<Interface>::registerImplementation(name, []() -> Interface* {
419 return new Class(std::move(std::unique_ptr<SrongOptionClass>(
new SrongOptionClass{})));
void add(ConstReferenceType val)
Adds element val to the end of the array.
1D data vector with value semantics (STL style).