diff options
Diffstat (limited to 'libbuild2/test/script/builtin.hxx')
-rw-r--r-- | libbuild2/test/script/builtin.hxx | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/libbuild2/test/script/builtin.hxx b/libbuild2/test/script/builtin.hxx new file mode 100644 index 0000000..b340335 --- /dev/null +++ b/libbuild2/test/script/builtin.hxx @@ -0,0 +1,74 @@ +// file : libbuild2/test/script/builtin.hxx -*- C++ -*- +// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef LIBBUILD2_TEST_SCRIPT_BUILTIN_HXX +#define LIBBUILD2_TEST_SCRIPT_BUILTIN_HXX + +#include <map> + +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +namespace build2 +{ + namespace test + { + namespace script + { + class scope; + + // A process/thread-like object representing a running builtin. + // + // For now, instead of allocating the result storage dynamically, we + // expect it to be provided by the caller. + // + class builtin + { + public: + uint8_t + wait () {if (t_.joinable ()) t_.join (); return r_;} + + ~builtin () {wait ();} + + public: + builtin (uint8_t& r, thread&& t = thread ()): r_ (r), t_ (move (t)) {} + + builtin (builtin&&) = default; + + private: + uint8_t& r_; + thread t_; + }; + + // Start builtin command. Throw system_error on failure. + // + // Note that unlike argc/argv, our args don't include the program name. + // + using builtin_func = builtin (scope&, + uint8_t& result, + const strings& args, + auto_fd in, auto_fd out, auto_fd err); + + class builtin_map: public std::map<string, builtin_func*> + { + public: + using base = std::map<string, builtin_func*>; + using base::base; + + // Return NULL if not a builtin. + // + builtin_func* + find (const string& n) const + { + auto i (base::find (n)); + return i != end () ? i->second : nullptr; + } + }; + + extern const builtin_map builtins; + } + } +} + +#endif // LIBBUILD2_TEST_SCRIPT_BUILTIN_HXX |