1 // Copyright David Abrahams 2002.
2 // Distributed under the Boost Software License, Version 1.0. (See
3 // accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5 #ifndef DICT_20020706_HPP
6 #define DICT_20020706_HPP
7 
8 # include <boost/python/detail/prefix.hpp>
9 
10 #include <boost/python/object.hpp>
11 #include <boost/python/list.hpp>
12 #include <boost/python/tuple.hpp>
13 #include <boost/python/converter/pytype_object_mgr_traits.hpp>
14 
15 namespace boost { namespace python {
16 
17 class dict;
18 
19 namespace detail
20 {
21   struct BOOST_PYTHON_DECL dict_base : object
22   {
23       // D.clear() -> None.  Remove all items from D.
24       void clear();
25 
26       // D.copy() -> a shallow copy of D
27       dict copy();
28 
29       // D.get(k[,d]) -> D[k] if D.has_key(k), else d.  d defaults to None.
30       object get(object_cref k) const;
31 
32       object get(object_cref k, object_cref d) const;
33 
34       // D.has_key(k) -> 1 if D has a key k, else 0
35       bool has_key(object_cref k) const;
36 
37       // D.items() -> list of D's (key, value) pairs, as 2-tuples
38       list items() const;
39 
40       // D.iteritems() -> an iterator over the (key, value) items of D
41       object iteritems() const;
42 
43       // D.iterkeys() -> an iterator over the keys of D
44       object iterkeys() const;
45 
46       // D.itervalues() -> an iterator over the values of D
47       object itervalues() const;
48 
49       // D.keys() -> list of D's keys
50       list keys() const;
51 
52       // D.popitem() -> (k, v), remove and return some (key, value) pair as a
53       // 2-tuple; but raise KeyError if D is empty
54       tuple popitem();
55 
56       // D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if not D.has_key(k)
57       object setdefault(object_cref k);
58 
59       object setdefault(object_cref k, object_cref d);
60 
61       // D.update(E) -> None.  Update D from E: for k in E.keys(): D[k] = E[k]
62       void update(object_cref E);
63 
64       // D.values() -> list of D's values
65       list values() const;
66 
67    protected:
68       // dict() -> new empty dictionary.
69       // dict(mapping) -> new dictionary initialized from a mapping object's
70       //     (key, value) pairs.
71       // dict(seq) -> new dictionary initialized as if via:
72       dict_base();   // new dict
73       explicit dict_base(object_cref data);
74 
75       BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(dict_base, object)
76    private:
77       static detail::new_reference call(object const&);
78   };
79 }
80 
81 class dict : public detail::dict_base
82 {
83     typedef detail::dict_base base;
84  public:
85     // dict() -> new empty dictionary.
86     // dict(mapping) -> new dictionary initialized from a mapping object's
87     //     (key, value) pairs.
88     // dict(seq) -> new dictionary initialized as if via:
dict()89     dict() {}   // new dict
90 
91     template <class T>
dict(T const & data)92     explicit dict(T const& data)
93         : base(object(data))
94     {
95     }
96 
97     template<class T>
get(T const & k) const98     object get(T const& k) const
99     {
100         return base::get(object(k));
101     }
102 
103     template<class T1, class T2>
get(T1 const & k,T2 const & d) const104     object get(T1 const& k, T2 const& d) const
105     {
106         return base::get(object(k),object(d));
107     }
108 
109     template<class T>
has_key(T const & k) const110     bool has_key(T const& k) const
111     {
112         return base::has_key(object(k));
113     }
114 
115     template<class T>
setdefault(T const & k)116     object setdefault(T const& k)
117     {
118         return base::setdefault(object(k));
119     }
120 
121     template<class T1, class T2>
setdefault(T1 const & k,T2 const & d)122     object setdefault(T1 const& k, T2 const& d)
123     {
124         return base::setdefault(object(k),object(d));
125     }
126 
127     template<class T>
update(T const & E)128     void update(T const& E)
129     {
130         base::update(object(E));
131     }
132 
133  public: // implementation detail -- for internal use only
134     BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(dict, base)
135 };
136 
137 //
138 // Converter Specializations
139 //
140 namespace converter
141 {
142   template <>
143   struct object_manager_traits<dict>
144       : pytype_object_manager_traits<&PyDict_Type,dict>
145   {
146   };
147 }
148 
149 }}   // namespace boost::python
150 
151 #endif
152 
153