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: |
89 | dict() {} // new dict |
90 | |
91 | template <class T> |
92 | explicit dict(T const& data) |
93 | : base(object(data)) |
94 | { |
95 | } |
96 | |
97 | template<class T> |
98 | object get(T const& k) const |
99 | { |
100 | return base::get(object(k)); |
101 | } |
102 | |
103 | template<class T1, class T2> |
104 | object get(T1 const& k, T2 const& d) const |
105 | { |
106 | return base::get(object(k),object(d)); |
107 | } |
108 | |
109 | template<class T> |
110 | bool has_key(T const& k) const |
111 | { |
112 | return base::has_key(object(k)); |
113 | } |
114 | |
115 | template<class T> |
116 | object setdefault(T const& k) |
117 | { |
118 | return base::setdefault(object(k)); |
119 | } |
120 | |
121 | template<class T1, class T2> |
122 | object setdefault(T1 const& k, T2 const& d) |
123 | { |
124 | return base::setdefault(object(k),object(d)); |
125 | } |
126 | |
127 | template<class T> |
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 | |