#pragma once #include #include #include #include #include #include #include #include namespace gdpm{ class error; /* Base class to prevent derived class from creating copies. */ class non_copyable{ public: non_copyable(){} private: non_copyable(const non_copyable&); non_copyable& operator=(const non_copyable&); }; /* Base class to prevent derived classes from moving objects. */ class non_movable{ non_movable(const non_movable&) = delete; non_movable(non_movable&&) = delete; }; enum variant_type_index : int{ INT = 0, FLOAT = 1, BOOL = 2, STRING = 3, STRING_LIST = 4, STRING_MAP = 5, SIZE_T = 6, }; using string = std::string; using string_list = std::vector; using string_map = std::unordered_map; using string_pair = std::pair; using id_list = std::vector; using any = std::any; using var = std::variant; template using _args_t = std::vector; using args_t = _args_t; using var_args = _args_t; using var_list = std::vector; using var_map = std::unordered_map; template > using _opts_t = std::unordered_map; using opts_t = _opts_t; using opt = std::pair; using var_opt = std::pair; using var_opts = _opts_t; template using _task_list = std::vector>; using task_list = _task_list; template using ptr = std::unique_ptr; namespace json{ using document = rapidjson::Document; using documents = std::vector; } namespace concepts{ template concept require_min_args = requires (std::size_t min){ sizeof...(Args) > min; }; } inline string_list unwrap(const var_args& args){ string_list sl; std::for_each(args.begin(), args.end(), [&sl](const var& v){ if(v.index() == STRING){ sl.emplace_back(std::get(v)); } }); return sl; } inline opts_t unwrap(const var_opts& opts){ opts_t o; std::for_each(opts.begin(), opts.end(), [&o](const var_opt& opt){ if(opt.second.index() == STRING){ string_list sl; string arg(std::get(opt.second)); // must make copy for const& sl.emplace_back(arg); o.insert(std::pair(opt.first, sl)); } }); return o; } template constexpr void get(const var& v, T& target){ switch(v.index()){ case INT: /*return*/ target = std::get(v); case FLOAT: /*return*/ target = std::get(v); case BOOL: /*return*/ target = std::get(v); case STRING: /*return*/ target = std::get(v); case STRING_LIST: /*return*/ target = std::get(v); case STRING_MAP: /*return*/ target = std::get(v); case SIZE_T: /*return*/ target = std::get(v); default: /*return*/ target = 0; } } }