43#ifndef LASS_GUARDIAN_OF_INCLUSION_UTIL_CONTAINER_H
44#define LASS_GUARDIAN_OF_INCLUSION_UTIL_CONTAINER_H
66template <
typename Container>
67struct ContainerTraitsBase
69 typedef Container container_type;
70 typedef typename Container::value_type value_type;
71 typedef typename Container::const_iterator const_iterator;
72 typedef typename Container::iterator iterator;
73 static Py_ssize_t size(
const container_type& c)
75 const Py_ssize_t size =
static_cast<Py_ssize_t
>(c.size());
76 LASS_ASSERT(size >= 0);
79 static const const_iterator begin(
const container_type& c)
83 static const iterator begin(container_type& c)
87 template <
typename It>
88 static const It next(It it, Py_ssize_t i = 1)
93 static void insert(container_type& c, iterator i, value_type value)
95 c.insert(i, std::move(value));
97 template <
typename InputIt>
98 static void insert(container_type& c, iterator i, InputIt first, InputIt last)
100 c.insert(i, first, last);
102 static void erase(container_type& c, iterator i)
106 static void erase(container_type& c, iterator first, iterator last)
108 c.erase(first, last);
110 static void clear(container_type& c)
114 static void reserve(container_type& , Py_ssize_t )
117 static const util::SharedPtr<container_type> copy(
const container_type& c)
119 return util::SharedPtr<container_type>(
new container_type(c));
121 static void inplace_repeat(container_type& c, Py_ssize_t n)
123 stde::inplace_repeat_c(c, n);
127template <
typename Container>
128struct ContainerTraits: ContainerTraitsBase<Container>
132template <
typename T,
typename A>
133struct ContainerTraits< std::vector<T, A> >: ContainerTraitsBase< std::vector<T, A> >
135 typedef typename ContainerTraitsBase< std::vector<T, A> >::container_type container_type;
136 static void reserve( container_type& c, Py_ssize_t n )
139 c.reserve(
static_cast<size_t>(n));
144class LASS_PYTHON_DLL ContainerImplBase
147 virtual ~ContainerImplBase() {};
148 virtual bool clear() = 0;
149 virtual Py_ssize_t length()
const = 0;
150 virtual PyObject* items()
const = 0;
151 virtual const TPyObjPtr asNative()
const = 0;
152 virtual const std::type_info& type()
const = 0;
153 virtual void* raw(
bool writable) = 0;
155 const std::string repr()
const;
159template <
typename Container,
typename Base>
160class ContainerImpl :
public Base
163 typedef Container TContainer;
164 typedef util::SharedPtr<Container> TContainerPtr;
165 typedef util::SharedPtr<const Container> TConstContainerPtr;
166 typedef ContainerTraits<Container> TContainerTraits;
168 bool clear()
override
170 if (!checkWritable())
174 TContainerTraits::clear(*container_);
177 Py_ssize_t length()
const override
179 return TContainerTraits::size(*container_);
181 PyObject* items()
const override
183 return new PyIteratorRange(container_->begin(), container_->end());
185 const std::type_info& type()
const override
187 return typeid(TContainerPtr);
189 void* raw(
bool writable)
override
191 if (writable && readOnly_)
198 ContainerImpl(
const TContainerPtr& container,
bool readOnly =
false):
199 container_(container),
202 LASS_ASSERT(container_);
204 bool checkWritable()
const
208 LockGIL LASS_UNUSED(lock);
209 PyErr_SetString(PyExc_TypeError,
"Container is read-only");
214 const TContainer& container()
const
218 TContainer& container()
222 const typename TContainerTraits::const_iterator begin()
const
224 return TContainerTraits::begin(*container_);
226 const typename TContainerTraits::iterator begin()
228 return TContainerTraits::begin(*container_);
230 template <
typename It>
static const It next(It it, Py_ssize_t i)
232 return TContainerTraits::next(it, i);
235 util::SharedPtr<Container> container_;
243 typename ConcreteTraits
245struct ShadowTraitsContainer
247 typedef typename PyObjectPtr<ShadowType>::Type TPyClassPtr;
248 typedef ShadowType TCppClass;
249 typedef TPyClassPtr TCppClassPtr;
250 typedef typename PyObjectPtr<const ShadowType>::Type TConstCppClassPtr;
252 template <
typename Container>
static int getObject(PyObject* obj, util::SharedPtr<Container>& container)
255 util::SharedPtr<TNonConstContainer> temp;
256 if (ConcreteTraits::getObjectImpl(obj, temp,
false) != 0)
260 container = temp.template constCast<Container>();
263 template <
typename Container>
static int getObject(PyObject* obj, Container& container)
265 util::SharedPtr<Container> temp;
266 if (ConcreteTraits::getObjectImpl(obj, temp,
false) != 0)
273 static int getObject(PyObject* obj, TPyClassPtr& shadow)
278 static int getObject(PyObject* obj, TConstCppClassPtr& shadow)
284 template <
typename T>
static TPyClassPtr buildObject(
const T& value)
286 return TPyClassPtr(
new ShadowType(value));
288 static TPyClassPtr buildObject(
const TPyClassPtr& shadow)
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
lass::util::SharedPtr< T, PyObjectStorage, PyObjectCounter > fromNakedToSharedPtrCast(PyObject *object)
fromNakedToSharedPtrCast.
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.