43#ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_ARGUMENT_TRAITS_H
44#define LASS_GUARDIAN_OF_INCLUSION_PYTHON_ARGUMENT_TRAITS_H
69struct ArgumentTraitsBuiltin
72 static const T& arg(
const TStorage& storage) {
return storage; }
80struct ArgumentTraitsBuiltin<T*>
89struct ArgumentTraitsBuiltin<const T*>
92 static const T* arg(
const TStorage& storage) {
return &storage; }
100struct ArgumentTraitsBuiltin<T&>
109struct ArgumentTraitsBuiltin<const T&>: ArgumentTraitsBuiltin<T>
120struct ArgumentTraitsPyObject
122 typedef python::NoNone< typename PyObjectPtr<T>::Type > TStorage;
123 static const T& arg(
const TStorage& storage) {
return *storage.reference(); }
130struct ArgumentTraitsPyObject<T*>
132 typedef typename PyObjectPtr<T>::Type TStorage;
133 static T* arg(
const TStorage& storage) {
return storage.get(); }
140struct ArgumentTraitsPyObject<T&>
142 typedef python::NoNone< typename PyObjectPtr<T>::Type > TStorage;
143 static T& arg(
const TStorage& storage) {
return *storage.reference(); }
150struct ArgumentTraitsPyObject<
util::SharedPtr<T, PyObjectStorage, PyObjectCounter> >
152 typedef typename PyObjectPtr<T>::Type TStorage;
153 static const TStorage& arg(
const TStorage& storage) {
return storage; }
164struct ArgumentTraitsShadowee
166 typedef typename ShadoweeTraits<T>::TPointerTraits TPointerTraits;
168 static const T& arg(
const TStorage& storage) {
return *storage.
reference(); }
176struct ArgumentTraitsShadowee<T&>
178 typedef typename ShadoweeTraits<T>::TPointerTraits TPointerTraits;
180 static T& arg(
const TStorage& storage) {
return *storage.
reference(); }
188struct ArgumentTraitsShadowee<T*>
190 typedef typename ShadoweeTraits<T>::TPointerTraits TPointerTraits;
191 typedef typename TPointerTraits::TPtr TStorage;
192 static T* arg(
const TStorage& storage) {
return TPointerTraits::get(storage); }
198template <
typename T,
template <
typename,
typename>
class S,
typename C>
199struct ArgumentTraitsShadowee<
util::SharedPtr<T, S, C> >
201 typedef util::SharedPtr<T, S, C> TStorage;
202 static const util::SharedPtr<T, S, C>& arg(
const TStorage& storage) {
return storage; }
212template <
typename T,
bool isPyObject,
bool isShadowee>
struct ArgumentTraitsSelector;
218struct ArgumentTraitsSelector<T, false, false>: ArgumentTraitsBuiltin<T>
226struct ArgumentTraitsSelector<T, true, false>: ArgumentTraitsPyObject<T>
234struct ArgumentTraitsSelector<T, false, true>: ArgumentTraitsShadowee<T>
246struct ArgumentTraits: impl::ArgumentTraitsSelector<T, IsPyObject<T>::value, ShadoweeTraits<T>::value>
264struct ArgumentTraits<T*>: impl::ArgumentTraitsSelector<T*, IsPyObject<T>::value, ShadoweeTraits<T>::value>
272struct ArgumentTraits<const T*>: impl::ArgumentTraitsSelector<const T*, IsPyObject<T>::value, ShadoweeTraits<T>::value>
280struct ArgumentTraits<T&>: impl::ArgumentTraitsSelector<T&, IsPyObject<T>::value, ShadoweeTraits<T>::value>
288struct ArgumentTraits<const T&>: impl::ArgumentTraitsSelector<const T&, IsPyObject<T>::value, ShadoweeTraits<T>::value>
295template <
typename T,
template <
typename,
typename>
class S,
typename C>
297 impl::ArgumentTraitsSelector< util::SharedPtr<T, S, C> , IsPyObject<T>::value, ShadoweeTraits<T>::value>
315 typedef std::optional<std::string> TStorage;
316 static const char* arg(
const TStorage& storage) {
return storage ? storage->c_str() :
nullptr; }
322 typedef std::optional<std::wstring> TStorage;
323 static const wchar_t* arg(
const TStorage& storage) {
return storage ? storage->c_str() :
nullptr; }
326#if LASS_HAVE_STD_U8STRING
330struct ArgumentTraits<const char8_t*>
332 typedef std::optional <std::u8string> TStorage;
333 static const char8_t* arg(
const TStorage& storage) {
return storage ? storage->c_str() :
nullptr; }
342 typedef std::optional <std::u16string> TStorage;
343 static const char16_t* arg(
const TStorage& storage) {
return storage ? storage->c_str() :
nullptr; }
349 typedef std::optional<std::u32string> TStorage;
350 static const char32_t* arg(
const TStorage& storage) {
return storage ? storage->c_str() :
nullptr; }
356 typedef std::basic_string<T> TStorage;
357 static const TStorage& arg(
const TStorage& storage) {
return storage; }
363 typedef void* TStorage;
364 static void* arg(
const TStorage& storage) {
return storage; }
367template <
typename T1,
typename T2>
370 typedef ArgumentTraits<T1> TArgTraits1;
371 typedef ArgumentTraits<T2> TArgTraits2;
372 typedef std::pair<typename TArgTraits1::TStorage, typename TArgTraits2::TStorage> TStorage;
373 static std::pair<T1, T2> arg(
const TStorage& storage)
375 return std::make_pair(TArgTraits1::arg(storage.first), TArgTraits2::arg(storage.second));
T & reference()
Return reference to wrapped value.
Comprehensive C++ to Python binding library.
general utility, debug facilities, ...
Library for Assembled Shared Sources.