summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '3rdParty/Boost/src/boost/program_options/variables_map.hpp')
-rw-r--r--3rdParty/Boost/src/boost/program_options/variables_map.hpp206
1 files changed, 206 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/program_options/variables_map.hpp b/3rdParty/Boost/src/boost/program_options/variables_map.hpp
new file mode 100644
index 0000000..02c4af2
--- /dev/null
+++ b/3rdParty/Boost/src/boost/program_options/variables_map.hpp
@@ -0,0 +1,206 @@
+// Copyright Vladimir Prus 2002-2004.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_VARIABLES_MAP_VP_2003_05_19
+#define BOOST_VARIABLES_MAP_VP_2003_05_19
+
+#include <boost/program_options/config.hpp>
+
+#include <boost/any.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <string>
+#include <map>
+#include <set>
+
+namespace boost { namespace program_options {
+
+ template<class charT>
+ class basic_parsed_options;
+
+ class value_semantic;
+ class variables_map;
+
+ // forward declaration
+
+ /** Stores in 'm' all options that are defined in 'options'.
+ If 'm' already has a non-defaulted value of an option, that value
+ is not changed, even if 'options' specify some value.
+ */
+ BOOST_PROGRAM_OPTIONS_DECL
+ void store(const basic_parsed_options<char>& options, variables_map& m,
+ bool utf8 = false);
+
+ /** Stores in 'm' all options that are defined in 'options'.
+ If 'm' already has a non-defaulted value of an option, that value
+ is not changed, even if 'options' specify some value.
+ This is wide character variant.
+ */
+ BOOST_PROGRAM_OPTIONS_DECL
+ void store(const basic_parsed_options<wchar_t>& options,
+ variables_map& m);
+
+
+ /** Runs all 'notify' function for options in 'm'. */
+ BOOST_PROGRAM_OPTIONS_DECL void notify(variables_map& m);
+
+ /** Class holding value of option. Contains details about how the
+ value is set and allows to conveniently obtain the value.
+ */
+ class BOOST_PROGRAM_OPTIONS_DECL variable_value {
+ public:
+ variable_value() : m_defaulted(false) {}
+ variable_value(const boost::any& v, bool defaulted)
+ : v(v), m_defaulted(defaulted)
+ {}
+
+ /** If stored value if of type T, returns that value. Otherwise,
+ throws boost::bad_any_cast exception. */
+ template<class T>
+ const T& as() const {
+ return boost::any_cast<const T&>(v);
+ }
+ /** @overload */
+ template<class T>
+ T& as() {
+ return boost::any_cast<T&>(v);
+ }
+
+ /// Returns true if no value is stored.
+ bool empty() const;
+ /** Returns true if the value was not explicitly
+ given, but has default value. */
+ bool defaulted() const;
+ /** Returns the contained value. */
+ const boost::any& value() const;
+
+ /** Returns the contained value. */
+ boost::any& value();
+ private:
+ boost::any v;
+ bool m_defaulted;
+ // Internal reference to value semantic. We need to run
+ // notifications when *final* values of options are known, and
+ // they are known only after all sources are stored. By that
+ // time options_description for the first source might not
+ // be easily accessible, so we need to store semantic here.
+ shared_ptr<const value_semantic> m_value_semantic;
+
+ friend BOOST_PROGRAM_OPTIONS_DECL
+ void store(const basic_parsed_options<char>& options,
+ variables_map& m, bool);
+
+ friend BOOST_PROGRAM_OPTIONS_DECL class variables_map;
+ };
+
+ /** Implements string->string mapping with convenient value casting
+ facilities. */
+ class BOOST_PROGRAM_OPTIONS_DECL abstract_variables_map {
+ public:
+ abstract_variables_map();
+ abstract_variables_map(const abstract_variables_map* next);
+
+ virtual ~abstract_variables_map() {}
+
+ /** Obtains the value of variable 'name', from *this and
+ possibly from the chain of variable maps.
+
+ - if there's no value in *this.
+ - if there's next variable map, returns value from it
+ - otherwise, returns empty value
+
+ - if there's defaulted value
+ - if there's next varaible map, which has a non-defauled
+ value, return that
+ - otherwise, return value from *this
+
+ - if there's a non-defauled value, returns it.
+ */
+ const variable_value& operator[](const std::string& name) const;
+
+ /** Sets next variable map, which will be used to find
+ variables not found in *this. */
+ void next(abstract_variables_map* next);
+
+ private:
+ /** Returns value of variable 'name' stored in *this, or
+ empty value otherwise. */
+ virtual const variable_value& get(const std::string& name) const = 0;
+
+ const abstract_variables_map* m_next;
+ };
+
+ /** Concrete variables map which store variables in real map.
+
+ This class is derived from std::map<std::string, variable_value>,
+ so you can use all map operators to examine its content.
+ */
+ class BOOST_PROGRAM_OPTIONS_DECL variables_map : public abstract_variables_map,
+ public std::map<std::string, variable_value>
+ {
+ public:
+ variables_map();
+ variables_map(const abstract_variables_map* next);
+
+ // Resolve conflict between inherited operators.
+ const variable_value& operator[](const std::string& name) const
+ { return abstract_variables_map::operator[](name); }
+
+ void notify();
+
+ private:
+ /** Implementation of abstract_variables_map::get
+ which does 'find' in *this. */
+ const variable_value& get(const std::string& name) const;
+
+ /** Names of option with 'final' values -- which should not
+ be changed by subsequence assignments. */
+ std::set<std::string> m_final;
+
+ friend BOOST_PROGRAM_OPTIONS_DECL
+ void store(const basic_parsed_options<char>& options,
+ variables_map& xm,
+ bool utf8);
+
+ /** Names of required options, filled by parser which has
+ access to options_description. */
+ std::set<std::string> m_required;
+ };
+
+
+ /*
+ * Templates/inlines
+ */
+
+ inline bool
+ variable_value::empty() const
+ {
+ return v.empty();
+ }
+
+ inline bool
+ variable_value::defaulted() const
+ {
+ return m_defaulted;
+ }
+
+ inline
+ const boost::any&
+ variable_value::value() const
+ {
+ return v;
+ }
+
+ inline
+ boost::any&
+ variable_value::value()
+ {
+ return v;
+ }
+
+}}
+
+#endif