#ifndef option_hh_INCLUDED #define option_hh_INCLUDED #include "enum.hh" #include "meta.hh" #include "vector.hh" #include "constexpr_utils.hh" namespace Kakoune { class String; // Forward declare functions that wont get found by ADL inline String option_to_string(int opt); inline String option_to_string(size_t opt); inline String option_to_string(bool opt); // Default fallback to single value functions template decltype(option_from_string(Meta::Type{}, StringView{})) option_from_strings(Meta::Type, ConstArrayView strs) { if (strs.size() != 1) throw runtime_error("expected a single value for option"); return option_from_string(Meta::Type{}, strs[0]); } template Vector()))> option_to_strings(const T& opt) { return Vector{option_to_string(opt)}; } template decltype(option_add(std::declval(), std::declval())) option_add_from_strings(T& opt, ConstArrayView strs) { if (strs.size() != 1) throw runtime_error("expected a single value for option"); return option_add(opt, strs[0]); } template constexpr bool option_needs_quoting(Meta::Type) { return not std::is_integral::value; } template struct PrefixedList { P prefix; Vector list; friend bool operator==(const PrefixedList& lhs, const PrefixedList& rhs) { return lhs.prefix == rhs.prefix and lhs.list == rhs.list; } friend bool operator!=(const PrefixedList& lhs, const PrefixedList& rhs) { return not (lhs == rhs); } }; template using TimestampedList = PrefixedList; enum class DebugFlags { None = 0, Hooks = 1 << 0, Shell = 1 << 1, Profile = 1 << 2, Keys = 1 << 3, Commands = 1 << 4, }; constexpr bool with_bit_ops(Meta::Type) { return true; } constexpr auto enum_desc(Meta::Type) { return make_array, 5>({ { DebugFlags::Hooks, "hooks" }, { DebugFlags::Shell, "shell" }, { DebugFlags::Profile, "profile" }, { DebugFlags::Keys, "keys" }, { DebugFlags::Commands, "commands" }, }); } } #endif // option_hh_INCLUDED