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>
25 char** argv_ = nullptr;
31 void assign(int argc, const char*const* argv)
34 char** new_argv = xbt_new(char*,argc + 1);
35 for (int i = 0; i < argc; i++)
36 new_argv[i] = xbt_strdup(argv[i]);
37 new_argv[argc] = nullptr;
39 this->argv_ = new_argv;
41 args(int argc, const char*const* argv)
43 this->assign(argc, argv);
46 char** to_argv() const
48 const int argc = argc_;
49 char** argv = xbt_new(char*, argc + 1);
50 for (int i=0; i< argc; i++)
51 argv[i] = xbt_strdup(argv_[i]);
59 for (int i = 0; i < this->argc_; i++)
60 std::free(this->argv_[i]);
61 std::free(this->argv_);
63 this->argv_ = nullptr;
68 args(args const& that)
70 this->assign(that.argc(), that.argv());
72 args& operator=(args const& that)
74 this->assign(that.argc(), that.argv());
79 args(args&& that) : argc_(that.argc_), argv_(that.argv_)
84 args& operator=(args&& that)
86 this->argc_ = that.argc_;
87 this->argv_ = that.argv_;
93 int argc() const { return argc_; }
94 char** argv() { return argv_; }
95 const char*const* argv() const { return argv_; }
96 char* operator[](std::size_t i) { return argv_[i]; }
99 template<class F> inline
100 std::function<void()> wrapMain(F code, std::shared_ptr<simgrid::xbt::args> args)
103 code(args->argc(), args->argv());
107 template<class F> inline
108 std::function<void()> wrapMain(F code, simgrid::xbt::args args)
110 return wrapMain(std::move(code),
111 std::unique_ptr<simgrid::xbt::args>(new simgrid::xbt::args(std::move(args))));
114 template<class F> inline
115 std::function<void()> wrapMain(F code, int argc, const char*const* argv)
117 return wrapMain(std::move(code), args(argc, argv));