#ifndef __FLAGS_LOADER_HPP__ #define __FLAGS_LOADER_HPP__ #include #include #include #include namespace flags { // Forward declaration. class FlagsBase; template struct Loader { static void load(T* flag, const std::tr1::function(const std::string&)>& parse, const std::string& name, const std::string& value) { Try t = parse(value); if (t.isSome()) { *flag = t.get(); } else { std::cerr << "Failed to load value '" << value << "' for flag '" << name << "': " << t.error() << std::endl; abort(); } } }; template struct OptionLoader { static void load(Option* flag, const std::tr1::function(const std::string&)>& parse, const std::string& name, const std::string& value) { Try t = parse(value); if (t.isSome()) { *flag = Option::some(t.get()); } else { std::cerr << "Failed to load value '" << value << "' for flag '" << name << "': " << t.error() << std::endl; abort(); } } }; template struct MemberLoader { static void load(FlagsBase* base, T F::*flag, const std::tr1::function(const std::string&)>& parse, const std::string& name, const std::string& value) { F* f = dynamic_cast(base); if (f != NULL) { Try t = parse(value); if (t.isSome()) { f->*flag = t.get(); } else { std::cerr << "Failed to load value '" << value << "' for flag '" << name << "': " << t.error() << std::endl; abort(); } } } }; template struct OptionMemberLoader { static void load(FlagsBase* base, Option F::*flag, const std::tr1::function(const std::string&)>& parse, const std::string& name, const std::string& value) { F* f = dynamic_cast(base); if (f != NULL) { Try t = parse(value); if (t.isSome()) { f->*flag = Option::some(t.get()); } else { std::cerr << "Failed to load value '" << value << "' for flag '" << name << "': " << t.error() << std::endl; abort(); } } } }; } // namespace flags { #endif // __FLAGS_LOADER_HPP__