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;
156 bool isReadOnly()
const;
157 bool checkWritable()
const;
160 ContainerImplBase(
bool readOnly);
167template <
typename Container,
typename Base>
168class ContainerImpl :
public Base
171 typedef Container TContainer;
172 typedef util::SharedPtr<Container> TContainerPtr;
173 typedef util::SharedPtr<const Container> TConstContainerPtr;
174 typedef ContainerTraits<Container> TContainerTraits;
176 bool clear()
override
178 if (!this->checkWritable())
182 TContainerTraits::clear(*container_);
185 Py_ssize_t length()
const override
187 return TContainerTraits::size(*container_);
189 PyObject* items()
const override
191 return new PyIteratorRange(container_->begin(), container_->end());
193 const std::type_info& type()
const override
195 return typeid(TContainerPtr);
197 void* raw(
bool writable)
override
199 if (writable && this->isReadOnly())
206 ContainerImpl(
const TContainerPtr& container,
bool readOnly =
false):
208 container_(container)
210 LASS_ASSERT(container_);
212 const TContainer& container()
const
216 TContainer& container()
220 const typename TContainerTraits::const_iterator begin()
const
222 return TContainerTraits::begin(*container_);
224 const typename TContainerTraits::iterator begin()
226 return TContainerTraits::begin(*container_);
228 template <
typename It>
static const It next(It it, Py_ssize_t i)
230 return TContainerTraits::next(it, i);
233 util::SharedPtr<Container> container_;
240 typename ConcreteTraits
242struct ShadowTraitsContainer
244 typedef typename PyObjectPtr<ShadowType>::Type TPyClassPtr;
245 typedef ShadowType TCppClass;
246 typedef TPyClassPtr TCppClassPtr;
247 typedef typename PyObjectPtr<const ShadowType>::Type TConstCppClassPtr;
249 template <
typename Container>
static int getObject(PyObject* obj, util::SharedPtr<Container>& container)
252 util::SharedPtr<TNonConstContainer> temp;
253 if (ConcreteTraits::getObjectImpl(obj, temp,
false) != 0)
257 container = temp.template constCast<Container>();
260 template <
typename Container>
static int getObject(PyObject* obj, Container& container)
262 util::SharedPtr<Container> temp;
263 if (ConcreteTraits::getObjectImpl(obj, temp,
false) != 0)
270 static int getObject(PyObject* obj, TPyClassPtr& shadow)
275 static int getObject(PyObject* obj, TConstCppClassPtr& shadow)
281 template <
typename T>
static TPyClassPtr buildObject(
const T& value)
283 return TPyClassPtr(
new ShadowType(value));
285 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.