]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - tools/elftosb/common/OptionDictionary.h
merged tx6dl-devel into denx master branch
[karo-tx-uboot.git] / tools / elftosb / common / OptionDictionary.h
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
13 namespace 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  */
28 class OptionDictionary : public OptionContext
29 {
30 public:
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         
86 protected:
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_