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 |
|
---|