OptionDictionary.h revision 1.1.4.2
1/* 2 * File: OptionDictionary.h 3 * 4 * Copyright (c) Freescale Semiconductor, Inc. All rights reserved. 5 * See included license file for license details. 6 */ 7#if !defined(_OptionDictionary_h_) 8#define _OptionDictionary_h_ 9 10#include "OptionContext.h" 11#include <map> 12 13namespace elftosb 14{ 15 16/*! 17 * \brief Concrete implementation of OptionContext. 18 * 19 * This context subclass supports having a parent context. If an option is not 20 * found in the receiving instance, the request is passed to the parent. 21 * The hasOption() and getOption() methods will ask up the parent chain 22 * if the requested option does not exist in the receiving instance. 23 * But the setOption() and deleteOption() methods only operate locally, 24 * on the instance on which they were called. This allows a caller to 25 * locally override an option value without affecting any of the parent 26 * contexts. 27 */ 28class OptionDictionary : public OptionContext 29{ 30public: 31 //! \brief Default constructor. 32 OptionDictionary() : m_parent(0) {} 33 34 //! \brief Constructor taking a parent context. 35 OptionDictionary(OptionContext * parent) : m_parent(parent) {} 36 37 //! \brief Destructor. 38 ~OptionDictionary(); 39 40 //! \name Parents 41 //@{ 42 //! \brief Returns the current parent context. 43 //! \return The current parent context instance. 44 //! \retval NULL No parent has been set. 45 inline OptionContext * getParent() const { return m_parent; } 46 47 //! \brief Change the parent context. 48 //! \param newParent The parent context object. May be NULL, in which case 49 //! the object will no longer have a parent context. 50 inline void setParent(OptionContext * newParent) { m_parent = newParent; } 51 //@} 52 53 //! \name Options 54 //@{ 55 //! \brief Detemine whether the named option is present in the table. 56 virtual bool hasOption(const std::string & name) const; 57 58 //! \brief Returns the option's value. 59 virtual const Value * getOption(const std::string & name) const; 60 61 //! \brief Adds or changes an option's value. 62 virtual void setOption(const std::string & name, Value * value); 63 64 //! \brief Removes an option from the table. 65 virtual void deleteOption(const std::string & name); 66 //@} 67 68 //! \name Locking 69 //@{ 70 //! \brief Returns true if the specified option is locked from further changes. 71 bool isOptionLocked(const std::string & name) const; 72 73 //! \brief Prevent further modifications of an option's value. 74 void lockOption(const std::string & name); 75 76 //! \brief Allow an option to be changed. 77 void unlockOption(const std::string & name); 78 //@} 79 80 //! \name Operators 81 //@{ 82 //! \brief Indexing operator; returns the value for the option \a name. 83 const Value * operator [] (const std::string & name) const; 84 //@} 85 86protected: 87 OptionContext * m_parent; //!< Our parent context. 88 89 /*! 90 * \brief Information about one option's value. 91 */ 92 struct OptionValue 93 { 94 Value * m_value; //!< The object for this option's value. 95 bool m_isLocked; //!< True if this value is locked from further changes. 96 97 //! \brief Constructor. 98 OptionValue() : m_value(0), m_isLocked(false) {} 99 }; 100 101 typedef std::map<std::string, OptionValue> option_map_t; //!< Map from option name to value. 102 option_map_t m_options; //!< The option dictionary. 103}; 104 105}; // namespace elftosb 106 107#endif // _OptionDictionary_h_ 108