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