xtd 1.0.0
Loading...
Searching...
No Matches
startup.hpp
Go to the documentation of this file.
1
4#pragma once
8#include "callable.hpp"
9#include "delegate.hpp"
10#include "environment.hpp"
11#include "exception.hpp"
12#include "static.hpp"
13
15namespace xtd {
22 class startup final static_ {
23 public:
25
45 static auto run(auto main_function) -> int {
46 try {
47 auto exit_code = internal_run(main_function);
49 return exit_code;
50 } catch (const std::exception& e) {
52 } catch (...) {
54 }
55 }
56
77 static auto run(auto main_function, int argc, char* argv[]) -> int {
78 xtd::environment::set_command_line_args({argv, argv + argc});
79 return run(main_function);
80 }
81
82
83 private:
84 static auto args() -> xtd::argument_collection {
86 return {args.begin() + 1, args.end()};
87 }
88
89 static auto argv_data() -> char** {return argv().data();}
90 static auto argv_length() -> int {return xtd::as<int>(argv().length());}
91 static auto argv() -> xtd::array<char*>& {
92 if (!argv_.empty()) return argv_;
93 argv_ = array<char*>(xtd::environment::get_command_line_args().length());
94 for (auto index = 0_z; index < xtd::environment::get_command_line_args().length(); ++index)
95 argv_[index] = const_cast<char*>(xtd::environment::get_command_line_args()[index].data());
96 return argv_;
97 }
98
99 static auto internal_run(xtd::callable<void> auto main_function) -> int {main_function(); return xtd::environment::exit_code();}
100 static auto internal_run(xtd::callable<void, int, char* []> auto main_function) -> int {main_function(argv_length(), argv_data()); return xtd::environment::exit_code();}
101 static auto internal_run(xtd::callable<void, const xtd::argument_collection&> auto main_function) -> int {main_function(args()); return xtd::environment::exit_code();}
102
103 static auto internal_run(xtd::callable<int> auto main_function) -> int {return main_function();}
104 static auto internal_run(xtd::callable<int, int, char* []> auto main_function) -> int {return main_function(argv_length(), argv_data());}
105 static auto internal_run(xtd::callable<int, const xtd::argument_collection&> auto main_function) -> int {return main_function(args());}
106
107 static auto internal_run(xtd::callable<xtd::threading::tasks::task<>> auto main_function) -> int {main_function().wait(); return xtd::environment::exit_code();}
108 static auto internal_run(xtd::callable<xtd::threading::tasks::task<>, int, char* []> auto main_function) -> int {main_function(argv_length(), argv_data()).wait(); return xtd::environment::exit_code();}
109 static auto internal_run(xtd::callable<xtd::threading::tasks::task<>, const xtd::argument_collection&> auto main_function) -> int {main_function(args()).wait(); return xtd::environment::exit_code();}
110
111 static auto internal_run(xtd::callable<xtd::threading::tasks::task<int>> auto main_function) -> int {return main_function().result();}
112 static auto internal_run(xtd::callable<xtd::threading::tasks::task<int>, int, char* []> auto main_function) -> int {return main_function(argv_length(), argv_data()).result();}
113 static auto internal_run(xtd::callable<xtd::threading::tasks::task<int>, const xtd::argument_collection&> auto main_function) -> int {return main_function(args()).result();}
114
115 static auto internal_run(xtd::callable<xtd::threading::tasks::wtask<>> auto main_function) -> int {main_function().wait(); return xtd::environment::exit_code();}
116 static auto internal_run(xtd::callable<xtd::threading::tasks::wtask<>, int, char* []> auto main_function) -> int {main_function(argv_length(), argv_data()).wait(); return xtd::environment::exit_code();}
117 static auto internal_run(xtd::callable<xtd::threading::tasks::wtask<>, const xtd::argument_collection&> auto main_function) -> int {main_function(args()).wait(); return xtd::environment::exit_code();}
118
119 static auto internal_run(xtd::callable<xtd::threading::tasks::wtask<int>> auto main_function) -> int {return main_function().result();}
120 static auto internal_run(xtd::callable<xtd::threading::tasks::wtask<int>, int, char* []> auto main_function) -> int {return main_function(argv_length(), argv_data()).result();}
121 static auto internal_run(xtd::callable<xtd::threading::tasks::wtask<int>, const xtd::argument_collection&> auto main_function) -> int {return main_function(args()).result();}
122
123 inline static xtd::array<char*> argv_;
124 };
125}
126
152#define startup_(...) \
153 auto main() -> int { \
154 return xtd::startup::run(__VA_ARGS__); \
155 } \
156 auto __xtd_opaque_ftews__ = 0 // force to end with semicolon
Contains xtd::argument_collection alias.
Contains xtd::callable concept.
static auto get_command_line_args() -> const xtd::argument_collection &
Returns a string array containing the command-line arguments for the current process.
static auto set_command_line_args(const xtd::argument_collection &args) -> void
Sets the command-line arguments for the current process.
static auto exit_code() noexcept -> xtd::int32
Gets the exit code of the process.
static auto show_exception() -> xtd::int32
Shows unspecified exception with xtd::forms::exception_dialog or xtd::console.
Definition exception.hpp:149
Defines the xtd::startup object that can be used in the main method to safely call the application's ...
Definition startup.hpp:22
static auto run(auto main_function) -> int
Safely call the specified application's main entry point.
Definition startup.hpp:45
static auto run(auto main_function, int argc, char *argv[]) -> int
Safely call the specified application's main entry point, argc and argv.
Definition startup.hpp:77
static auto join_all() -> void
Blocks the calling thread until all joinable threads terminate.
Contains xtd::delegate <result_t(arguments_t...)> delegate.
Contains xtd::environment class.
Contains xtd::exception exception.
#define static_
This keyword is use to represent a static object. A static object can't be instantiated (constructors...
Definition static.hpp:38
auto as(any_object &o) -> type_t
Casts a type into another type.
Definition __as_any_object.hpp:60
xtd::array< xtd::string > argument_collection
Represents the collection of arguments passed to the main entry point method.
Definition argument_collection.hpp:19
@ e
The E key.
Definition console_key.hpp:96
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition abstract_object.hpp:8
constexpr auto data() const noexcept -> const_pointer
Gets direct access to the underlying contiguous storage.
Definition read_only_span.hpp:196
constexpr auto length() const noexcept -> size_type
Returns the length of the current read_only_span.
Definition read_only_span.hpp:212
Contains xtd::static_object class.
Contains xtd::threading::tasks::task <> class.
Contains xtd::threading::tasks::task <result_t> class.