diff options
Diffstat (limited to 'sources/shiboken6/tests/libsmart/smart.cpp')
-rw-r--r-- | sources/shiboken6/tests/libsmart/smart.cpp | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/sources/shiboken6/tests/libsmart/smart.cpp b/sources/shiboken6/tests/libsmart/smart.cpp new file mode 100644 index 000000000..2273040f9 --- /dev/null +++ b/sources/shiboken6/tests/libsmart/smart.cpp @@ -0,0 +1,272 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "smart.h" + +#include <algorithm> +#include <iostream> + +static inline bool verbose() +{ + return Registry::getInstance()->verbose(); +} + +void SharedPtrBase::logDefaultConstructor(const char *instantiation, const void *t) +{ + if (verbose()) + std::cout << "SharedPtr<" << instantiation << "> default constructor " << t << '\n'; +} + +void SharedPtrBase::logConstructor(const char *instantiation, const void *t, + const void *pointee) +{ + if (verbose()) { + std::cout << "SharedPtr<" << instantiation << "> constructor " + << t << " with pointer " << pointee << '\n'; + } +} + +void SharedPtrBase::logCopyConstructor(const char *instantiation, const void *t, + const void *refData) +{ + if (verbose()) { + std::cout << "SharedPtr<" << instantiation << ">) copy constructor " + << t << " with pointer " << refData << '\n'; + } +} + +void SharedPtrBase::logAssignment(const char *instantiation, const void *t, const void *refData) +{ + if (verbose()) { + std::cout << "SharedPtr<" << instantiation << ">::operator= " << t + << " with pointer " << refData << "\n"; + } +} + +void SharedPtrBase::logDestructor(const char *instantiation, const void *t, + int remainingRefCount) +{ + if (verbose()) { + std::cout << "~SharedPtr<" << instantiation << "> " << t << ", remaining refcount " + << remainingRefCount << '\n'; + } +} + +Obj::Obj() : m_integer(123), m_internalInteger(new Integer) +{ + Registry::getInstance()->add(this); + if (verbose()) + std::cout << "Obj constructor " << this << '\n'; +} + +Obj::~Obj() +{ + Registry::getInstance()->remove(this); + delete m_internalInteger; + if (verbose()) + std::cout << "~Obj " << this << '\n'; +} + + +void Obj::printObj() { + if (verbose()) { + std::cout << "Obj::printObj(): integer value: " << m_integer + << " internal integer value: " << m_internalInteger->value() << '\n'; + } +} + + +SharedPtr<Obj> Obj::createSharedPtrObj() +{ + SharedPtr<Obj> o(new Obj); + return o; +} + +std::vector<SharedPtr<Obj> > Obj::createSharedPtrObjList(int size) +{ + std::vector<SharedPtr<Obj> > r; + for (int i=0; i < size; i++) + r.push_back(createSharedPtrObj()); + return r; +} + + +SharedPtr<Integer> Obj::createSharedPtrInteger() +{ + SharedPtr<Integer> o(new Integer); + return o; +} + +SharedPtr<Smart::Integer2> Obj::createSharedPtrInteger2() +{ + SharedPtr<Smart::Integer2> o(new Smart::Integer2); + return o; +} + +int Obj::takeSharedPtrToObj(SharedPtr<Obj> pObj) +{ + pObj->printObj(); + return pObj->m_integer; +} + +int Obj::takeSharedPtrToInteger(SharedPtr<Integer> pInt) +{ + if (pInt.isNull()) { + std::cout << "SharedPtr<Integer>(nullptr) passed!\n"; + return -1; + } + pInt->printInteger(); + return pInt->value(); +} + +int Obj::takeSharedPtrToIntegerByConstRef(const SharedPtr<Integer> &pInt) +{ + if (pInt.isNull()) { + std::cout << "SharedPtr<Integer>(nullptr) passed!\n"; + return -1; + } + pInt->printInteger(); + return pInt->value(); +} + +SharedPtr<Integer> Obj::createSharedPtrInteger(int value) +{ + auto *i = new Integer; + i->setValue(value); + return SharedPtr<Integer>(i); +} + +SharedPtr<Integer> Obj::createNullSharedPtrInteger() +{ + return {}; +} + +SharedPtr<const Integer> Obj::createSharedPtrConstInteger() +{ + SharedPtr<const Integer> co(new Integer); + return co; +} + +int Obj::takeSharedPtrToConstInteger(SharedPtr<const Integer> pInt) +{ + return pInt->m_int; +} + +Integer Obj::takeInteger(Integer val) +{ + return val; +} + +Integer::Integer() : m_int(456) +{ + Registry::getInstance()->add(this); + if (verbose()) + std::cout << "Integer constructor " << this << '\n'; +} + +Integer::Integer(const Integer &other) +{ + Registry::getInstance()->add(this); + if (verbose()) + std::cout << "Integer copy constructor " << this << '\n'; + m_int = other.m_int; +} + +Integer &Integer::operator=(const Integer &other) +{ + Registry::getInstance()->add(this); + if (verbose()) + std::cout << "Integer operator= " << this << '\n'; + m_int = other.m_int; + return *this; +} + +Integer::~Integer() +{ + Registry::getInstance()->remove(this); + if (verbose()) + std::cout << "~Integer " << this << " (" << m_int << ")\n"; +} + +int Integer::value() const +{ + return m_int; +} + +void Integer::setValue(int v) +{ + m_int = v; + if (verbose()) + std::cout << "Integer::setValue(" << v << ") " << this << '\n'; +} + +int Integer::compare(const Integer &rhs) const +{ + if (m_int < rhs.m_int) + return -1; + return m_int > rhs.m_int ? 1 : 0; +} + +void Integer::printInteger() const +{ + if (verbose()) + std::cout << "Integer value for object " << this << " is " << m_int << '\n'; +} + +Registry *Registry::getInstance() +{ + static Registry registry; + return ®istry; +} + +Registry::Registry() = default; + +Registry::~Registry() = default; + +void Registry::add(Obj *p) +{ + m_objects.push_back(p); +} + +void Registry::add(Integer *p) +{ + m_integers.push_back(p); +} + +void Registry::remove(Obj *p) +{ + m_objects.erase(std::remove(m_objects.begin(), m_objects.end(), p), m_objects.end()); +} + +void Registry::remove(Integer *p) +{ + m_integers.erase(std::remove(m_integers.begin(), m_integers.end(), p), m_integers.end()); +} + +int Registry::countObjects() const +{ + return static_cast<int>(m_objects.size()); +} + +int Registry::countIntegers() const +{ + return static_cast<int>(m_integers.size()); +} + +bool Registry::verbose() const +{ + return m_verbose; +} + +void Registry::setVerbose(bool flag) +{ + m_verbose = flag; +} + +Smart::Integer2::Integer2() + : Integer () +{ +} + +Smart::Integer2::Integer2(const Smart::Integer2 &) = default; +Smart::Integer2 &Smart::Integer2::operator=(const Integer2 &) = default; |