-namespace simgrid {
-namespace simix {
-
-class XBT_PRIVATE args {
-private:
- int argc_;
- char** argv_;
-public:
-
- // Main constructors
- args() : argc_(0), argv_(nullptr) {}
- args(int argc, char** argv) : argc_(argc), argv_(argv) {}
-
- // Free
- void clear()
- {
- for (int i = 0; i < this->argc_; i++)
- free(this->argv_[i]);
- free(this->argv_);
- this->argc_ = 0;
- this->argv_ = nullptr;
- }
- ~args() { clear(); }
-
- // Copy
- args(args const& that) = delete;
- args& operator=(args const& that) = delete;
-
- // Move:
- args(args&& that) : argc_(that.argc_), argv_(that.argv_)
- {
- that.argc_ = 0;
- that.argv_ = nullptr;
- }
- args& operator=(args&& that)
- {
- this->argc_ = that.argc_;
- this->argv_ = that.argv_;
- that.argc_ = 0;
- that.argv_ = nullptr;
- return *this;
- }
-
- int argc() const { return argc_; }
- char** argv() { return argv_; }
- const char*const* argv() const { return argv_; }
- char* operator[](std::size_t i) { return argv_[i]; }
-};
-
-}
-}
-
-static
-std::function<void()> wrap_main(xbt_main_func_t code, int argc, char **argv)
-{
- if (code) {
- auto arg = std::make_shared<simgrid::simix::args>(argc, argv);
- return [=]() {
- code(arg->argc(), arg->argv());
- };
- } else return std::function<void()>();
-}
-