1 /* Copyright (c) 2015-2016. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #ifndef XBT_FUNCTIONAL_HPP
8 #define XBT_FUNCTIONAL_HPP
17 #include <xbt/sysdep.h>
18 #include <xbt/utility.hpp>
26 char** argv_ = nullptr;
32 void assign(int argc, const char*const* argv)
35 char** new_argv = xbt_new(char*,argc + 1);
36 for (int i = 0; i < argc; i++)
37 new_argv[i] = xbt_strdup(argv[i]);
38 new_argv[argc] = nullptr;
40 this->argv_ = new_argv;
42 args(int argc, const char*const* argv)
44 this->assign(argc, argv);
47 char** to_argv() const
49 const int argc = argc_;
50 char** argv = xbt_new(char*, argc + 1);
51 for (int i=0; i< argc; i++)
52 argv[i] = xbt_strdup(argv_[i]);
60 for (int i = 0; i < this->argc_; i++)
61 std::free(this->argv_[i]);
62 std::free(this->argv_);
64 this->argv_ = nullptr;
69 args(args const& that)
71 this->assign(that.argc(), that.argv());
73 args& operator=(args const& that)
75 this->assign(that.argc(), that.argv());
80 args(args&& that) : argc_(that.argc_), argv_(that.argv_)
85 args& operator=(args&& that)
87 this->argc_ = that.argc_;
88 this->argv_ = that.argv_;
94 int argc() const { return argc_; }
95 char** argv() { return argv_; }
96 const char*const* argv() const { return argv_; }
97 char* operator[](std::size_t i) { return argv_[i]; }
100 template<class F> inline
101 std::function<void()> wrapMain(F code, std::shared_ptr<simgrid::xbt::args> args)
104 code(args->argc(), args->argv());
108 template<class F> inline
109 std::function<void()> wrapMain(F code, simgrid::xbt::args args)
111 return wrapMain(std::move(code),
112 std::unique_ptr<simgrid::xbt::args>(new simgrid::xbt::args(std::move(args))));
115 template<class F> inline
116 std::function<void()> wrapMain(F code, int argc, const char*const* argv)
118 return wrapMain(std::move(code), args(argc, argv));
122 template <class F, class Tuple, std::size_t... I>
123 constexpr auto apply(F&& f, Tuple&& t, simgrid::xbt::index_sequence<I...>)
124 -> decltype(std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...))
126 return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...);
130 /** Call a functional object with the values in the given tuple (from C++17)
133 * int foo(int a, bool b);
135 * auto args = std::make_tuple(1, false);
136 * int res = apply(foo, args);
139 template <class F, class Tuple>
140 constexpr auto apply(F&& f, Tuple&& t)
141 -> decltype(simgrid::xbt::bits::apply(
143 std::forward<Tuple>(t),
144 simgrid::xbt::make_index_sequence<
145 std::tuple_size<typename std::decay<Tuple>::type>::value
148 return simgrid::xbt::bits::apply(
150 std::forward<Tuple>(t),
151 simgrid::xbt::make_index_sequence<
152 std::tuple_size<typename std::decay<Tuple>::type>::value