Tools and libraries to glue C/C++ APIs to high-level languages
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

981 lines
22 KiB

#pragma once
#include "../Tests.h"
#include "AnotherUnit.h"
#include <string>
#include <map>
class DeriveProtectedDtor
{
protected:
~DeriveProtectedDtor() {}
};
class DLL_API QString
{
};
class DLL_API T1
{
};
class DLL_API T2
{
public:
T2();
T2(int f);
virtual ~T2();
int getField() const;
void setField(int value);
private:
int field;
};
class DLL_API Ignored
{
};
template <typename T>
class HasAbstractReturnPointer
{
public:
HasAbstractReturnPointer();
~HasAbstractReturnPointer();
virtual const T* abstractReturnPointer() = 0;
};
template <typename T>
HasAbstractReturnPointer<T>::HasAbstractReturnPointer()
{
}
template <typename T>
HasAbstractReturnPointer<T>::~HasAbstractReturnPointer()
{
}
template <typename T>
class ImplReturnPointer : public HasAbstractReturnPointer<T>
{
public:
ImplReturnPointer();
~ImplReturnPointer();
virtual const T* abstractReturnPointer() override;
};
template <typename T>
ImplReturnPointer<T>::ImplReturnPointer()
{
}
template <typename T>
ImplReturnPointer<T>::~ImplReturnPointer()
{
}
template <typename T>
const T* ImplReturnPointer<T>::abstractReturnPointer()
{
return 0;
}
template <typename T>
class IndependentFields : public T1
{
typedef T Type;
public:
class Nested
{
private:
T field;
};
IndependentFields();
IndependentFields(const IndependentFields<T>& other);
IndependentFields(const T& t);
IndependentFields(T1* t1);
IndependentFields(T2* t2);
IndependentFields(float f);
~IndependentFields();
explicit IndependentFields(const std::map<T, T> &other);
float getIndependent();
T getDependent(const T& t);
Type property();
static T staticDependent(const T& t);
template <typename AdditionalDependentType>
void usesAdditionalDependentType(AdditionalDependentType additionalDependentType);
static const int independentConst;
private:
float independent;
};
template <typename T>
const int IndependentFields<T>::independentConst = 15;
template <typename T>
IndependentFields<T>::IndependentFields() : independent(1)
{
}
template <typename T>
IndependentFields<T>::IndependentFields(const IndependentFields<T>& other)
{
independent = other.independent;
}
template <typename T>
IndependentFields<T>::IndependentFields(const T& t) : independent(1)
{
}
template <typename T>
IndependentFields<T>::IndependentFields(T1* t1) : independent(1)
{
}
template <typename T>
IndependentFields<T>::IndependentFields(T2* t2) : independent(1)
{
}
template <typename T>
IndependentFields<T>::IndependentFields(float f)
{
independent = f;
}
template <typename T>
IndependentFields<T>::IndependentFields(const std::map<T, T> &v) : independent(1)
{
}
template <typename T>
IndependentFields<T>::~IndependentFields()
{
}
template <typename T>
T IndependentFields<T>::getDependent(const T& t)
{
return t;
}
template <typename T>
T IndependentFields<T>::property()
{
return T();
}
template <typename T>
T IndependentFields<T>::staticDependent(const T& t)
{
return t;
}
template <typename T>
template <typename AdditionalDependentType>
void IndependentFields<T>::usesAdditionalDependentType(AdditionalDependentType additionalDependentType)
{
}
template <typename T>
float IndependentFields<T>::getIndependent()
{
return independent;
}
template <typename X>
class DerivedChangesTypeName : public IndependentFields<X>
{
};
template <typename T>
class DLL_API DependentValueFieldForArray
{
private:
T field{};
};
template <typename T>
class Base
{
public:
class Nested
{
public:
void f(const T& t);
friend void f(Nested& n) {}
};
void invokeFriend();
typedef T* typedefT;
};
template <typename T>
void Base<T>::Nested::f(const T& t)
{
}
template <typename T>
void Base<T>::invokeFriend()
{
f(Nested());
}
template <typename T>
struct TemplateUnionField
{
union
{
struct
{
T x, y, z;
};
T v;
};
};
struct TemplateUnionFieldInstantiation
{
TemplateUnionField<int> tuf;
TemplateUnionField<float> tuf1;
};
template <typename T>
class DependentValueFields : public Base<T>
{
public:
class Nested;
class Nested
{
T field;
};
DependentValueFields();
DependentValueFields(IndependentFields<T> i);
~DependentValueFields();
DependentValueFields& returnInjectedClass();
DependentValueFields returnValue();
DependentValueFields operator+(const DependentValueFields& other);
T getDependentValue();
void setDependentValue(const T& value);
IndependentFields<Nested> returnNestedInTemplate();
typename Base<T>::typedefT typedefT() { return 0; }
const T* returnTakeDependentPointer(const T* p);
const T* propertyReturnDependentPointer();
void hasDefaultDependentParam(T* ptr, const T& refT = T());
HasAbstractReturnPointer<T>* getAbstractReturnPointer();
typedef void (*DependentFunctionPointer)(T);
DependentFunctionPointer dependentFunctionPointerField;
private:
T field{};
union {
int unionField;
};
};
template <typename T>
DependentValueFields<T>::DependentValueFields() : unionField(0), dependentFunctionPointerField(0)
{
}
template <typename T>
DependentValueFields<T>::~DependentValueFields()
{
}
template <typename T>
DependentValueFields<T>::DependentValueFields(IndependentFields<T> i) : DependentValueFields()
{
}
template <typename T>
T DependentValueFields<T>::getDependentValue()
{
return field;
}
template <typename T>
void DependentValueFields<T>::setDependentValue(const T& value)
{
field = value;
}
template <typename T>
IndependentFields<typename DependentValueFields<T>::Nested> DependentValueFields<T>::returnNestedInTemplate()
{
return DependentValueFields<T>::Nested();
}
template <typename T>
const T* DependentValueFields<T>::returnTakeDependentPointer(const T* p)
{
return p;
}
template <typename T>
const T* DependentValueFields<T>::propertyReturnDependentPointer()
{
return 0;
}
template <typename T>
void DependentValueFields<T>::hasDefaultDependentParam(T* ptr, const T& refT)
{
}
template <typename T>
HasAbstractReturnPointer<T>* DependentValueFields<T>::getAbstractReturnPointer()
{
return new ImplReturnPointer<T>();
}
template <typename T>
DependentValueFields<T>& DependentValueFields<T>::returnInjectedClass()
{
return *this;
}
template <typename T>
DependentValueFields<T> DependentValueFields<T>::returnValue()
{
return *this;
}
template <typename T>
DependentValueFields<T> DependentValueFields<T>::operator+(const DependentValueFields& other)
{
return DependentValueFields<T>();
}
class DLL_API DerivedFromSpecializationOfUnsupportedTemplate : public DependentValueFields<int>
{
};
template <typename T>
class DependentPointerFields
{
public:
DependentPointerFields(T* t = 0);
~DependentPointerFields();
T property();
T takeField(T t);
T* field;
};
template <typename T>
DependentPointerFields<T>::DependentPointerFields(T* t) : field(t)
{
}
template <typename T>
DependentPointerFields<T>::~DependentPointerFields()
{
}
template <typename T>
T DependentPointerFields<T>::property()
{
return *field;
}
template <typename T>
T DependentPointerFields<T>::takeField(T t)
{
return *field;
}
template <typename K, typename V>
class TwoTemplateArgs
{
public:
class iterator
{
public:
iterator();
~iterator();
};
void takeDependentPtrToFirstTemplateArg(iterator i, const K& k);
void takeDependentPtrToSecondTemplateArg(const V& v);
private:
K key;
V value;
};
template <typename K, typename V>
TwoTemplateArgs<K, V>::iterator::iterator()
{
}
template <typename K, typename V>
TwoTemplateArgs<K, V>::iterator::~iterator()
{
}
template <typename K, typename V>
void TwoTemplateArgs<K, V>::takeDependentPtrToFirstTemplateArg(iterator i, const K& k)
{
}
template <typename K, typename V>
void TwoTemplateArgs<K, V>::takeDependentPtrToSecondTemplateArg(const V& v)
{
}
template <typename T, typename D = IndependentFields<T>>
class HasDefaultTemplateArgument
{
public:
HasDefaultTemplateArgument();
~HasDefaultTemplateArgument();
T property();
void setProperty(const T& t);
static T staticProperty();
static void setStaticProperty(const T& t);
bool operator==(const HasDefaultTemplateArgument& other);
DependentValueFields<D> returnTemplateWithRenamedTypeArg(const DependentValueFields<D>& value);
DependentValueFields<D> propertyReturnsTemplateWithRenamedTypeArg();
private:
T field{};
static T staticField;
};
template <>
class DLL_API HasDefaultTemplateArgument<bool, bool>
{
public:
bool property();
void setProperty(const bool& t);
static bool staticProperty();
static void setStaticProperty(const bool& t);
private:
bool field;
static bool staticField;
};
template <typename T, typename D>
HasDefaultTemplateArgument<T, D>::HasDefaultTemplateArgument()
{
}
template <typename T, typename D>
HasDefaultTemplateArgument<T, D>::~HasDefaultTemplateArgument()
{
}
template <typename T, typename D>
T HasDefaultTemplateArgument<T, D>::property()
{
return field;
}
template <typename T, typename D>
void HasDefaultTemplateArgument<T, D>::setProperty(const T& t)
{
field = t;
}
template <typename T, typename D>
T HasDefaultTemplateArgument<T, D>::staticProperty()
{
return staticField;
}
template <typename T, typename D>
void HasDefaultTemplateArgument<T, D>::setStaticProperty(const T& t)
{
staticField = t;
}
template <typename T, typename D>
bool HasDefaultTemplateArgument<T, D>::operator==(const HasDefaultTemplateArgument& other)
{
return field == other.field;
}
template <typename T, typename D>
DependentValueFields<D> HasDefaultTemplateArgument<T, D>::returnTemplateWithRenamedTypeArg(const DependentValueFields<D>& value)
{
return value;
}
template <typename T, typename D>
DependentValueFields<D> HasDefaultTemplateArgument<T, D>::propertyReturnsTemplateWithRenamedTypeArg()
{
return DependentValueFields<D>();
}
template <typename T, typename D>
T HasDefaultTemplateArgument<T, D>::staticField;
template <typename T, typename D>
class DerivesFromTemplateWithExplicitSpecialization : public HasDefaultTemplateArgument<T, D>
{
public:
DerivesFromTemplateWithExplicitSpecialization();
~DerivesFromTemplateWithExplicitSpecialization();
};
template <typename T, typename D>
DerivesFromTemplateWithExplicitSpecialization<T, D>::DerivesFromTemplateWithExplicitSpecialization()
{
}
template <typename T, typename D>
DerivesFromTemplateWithExplicitSpecialization<T, D>::~DerivesFromTemplateWithExplicitSpecialization()
{
}
class DLL_API DerivesFromExplicitSpecialization : public DerivesFromTemplateWithExplicitSpecialization<bool, bool>
{
};
template <typename T>
class InternalWithExtension
{
public:
const T* extension();
};
template <typename T>
const T* InternalWithExtension<T>::extension()
{
return 0;
}
template <typename T>
class TemplateWithIndexer
{
public:
TemplateWithIndexer();
~TemplateWithIndexer();
T& operator[](int i);
T& operator[](const T& key);
T& operator[](const char* string);
private:
T t[1];
HasDefaultTemplateArgument<char> h;
InternalWithExtension<char> i;
HasDefaultTemplateArgument<T, double> specializationAsFieldOfAnother;
};
template <typename T>
TemplateWithIndexer<T>::TemplateWithIndexer()
{
}
template <typename T>
TemplateWithIndexer<T>::~TemplateWithIndexer<T>()
{
}
template <typename T>
T& TemplateWithIndexer<T>::operator[](int i)
{
return t[0];
}
template <typename T>
T& TemplateWithIndexer<T>::operator[](const T& key)
{
return t[0];
}
template <typename T>
T& TemplateWithIndexer<T>::operator[](const char* string)
{
return t[0];
}
template <typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void,
typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void>
class OptionalTemplateArgs
{
};
template <typename T>
class VirtualTemplate
{
public:
VirtualTemplate();
VirtualTemplate(IndependentFields<int> i);
VirtualTemplate(OptionalTemplateArgs<T> optionalTemplateArgs);
virtual ~VirtualTemplate();
virtual int function();
virtual T* function(T* t);
DependentValueFields<float> fieldWithSpecializationType;
};
template <typename T>
VirtualTemplate<T>::VirtualTemplate()
{
}
template <typename T>
VirtualTemplate<T>::VirtualTemplate(IndependentFields<int> i)
{
}
template <typename T>
VirtualTemplate<T>::VirtualTemplate(OptionalTemplateArgs<T> optionalTemplateArgs)
{
}
template <typename T>
VirtualTemplate<T>::~VirtualTemplate()
{
}
template <typename T>
int VirtualTemplate<T>::function()
{
return 5;
}
template <typename T>
T* VirtualTemplate<T>::function(T* t)
{
return t;
}
template <typename T>
class VirtualDependentValueFields
{
public:
VirtualDependentValueFields();
virtual ~VirtualDependentValueFields();
private:
T t;
};
template <typename T>
VirtualDependentValueFields<T>::VirtualDependentValueFields()
{
}
template <typename T>
VirtualDependentValueFields<T>::~VirtualDependentValueFields()
{
}
class DLL_API HasVirtualTemplate
{
public:
VirtualTemplate<int> getVCopy();
void setV(VirtualTemplate<int>* value);
int function();
private:
VirtualTemplate<int>* v;
HasDefaultTemplateArgument<bool, bool> explicitSpecialization;
};
class DLL_API SpecializedInterfaceForMap : public InternalWithExtension<char>
{
};
class DLL_API HasSpecializationForSecondaryBase : public DependentValueFields<int>,
public IndependentFields<int>,
public InternalWithExtension<float>
{
};
template <typename T>
class TemplateInAnotherUnit;
class DLL_API TemplateSpecializer
{
public:
template <typename T>
class NestedTemplate
{
};
IndependentFields<bool> getIndependentFields();
void completeSpecializationInParameter(DependentValueFields<float> p1,
DependentValueFields<int*> p2,
DependentValueFields<float*> p3);
void completeSpecializationInParameter(TwoTemplateArgs<int*, int*> p1,
TwoTemplateArgs<int*, int> p2,
TwoTemplateArgs<int*, float> p3,
TwoTemplateArgs<const char*, int> p4,
TwoTemplateArgs<QString, int> p5);
void completeSpecializationInParameter(TwoTemplateArgs<const char*, int>::iterator p6,
TwoTemplateArgs<QString, int>::iterator p7);
VirtualTemplate<void> returnSpecializedWithVoid();
private:
IndependentFields<int> independentFields;
DependentValueFields<bool> dependentValueFields;
DependentPointerFields<int> dependentPointerFields;
HasDefaultTemplateArgument<int> hasDefaultTemplateArgument;
DependentValueFields<T1> dependentPointerFieldsT1;
DependentValueFields<T2> dependentPointerFieldsT2;
TemplateInAnotherUnit<float> templateInAnotherUnit;
DependentValueFields<IndependentFields<int>> specializeWithSpecialization;
DependentValueFields<IndependentFields<bool>> specializeWithSameSpecialization;
NestedTemplate<int> nestedTemplate;
DependentValueFields<DependentValueFields<int*>> nestedDependentPointer1;
DependentValueFields<DependentValueFields<char*>> nestedDependentPointer2;
DependentValueFieldForArray<char[3]> dependentFieldArray;
};
template <typename Key, typename T>
class PartiallySpecialized
{
};
template <typename Key>
class PartiallySpecialized<Key, int>
{
union
{
int i;
float f;
};
};
template<class T>
class HasResultType {
typedef char Yes;
typedef void *No;
template<typename U> static Yes test(int, const typename U::result_type * = 0);
template<typename U> static No test(double);
public:
enum { Value = (sizeof(test<T>(0)) == sizeof(Yes)) };
};
template <typename Functor, bool foo = HasResultType<Functor>::Value>
struct LazyResultType { typedef typename Functor::result_type Type; };
template <typename Functor>
struct LazyResultType<Functor, false> { typedef void Type; };
template <class InputSequence, class MapFunctor>
struct MapResultType
{
typedef typename LazyResultType<MapFunctor>::Type ResultType;
};
template <template <typename> class InputSequence, typename MapFunctor, typename T>
struct MapResultType<InputSequence<T>, MapFunctor>
{
typedef InputSequence<typename LazyResultType<MapFunctor>::Type> ResultType;
};
class DLL_API RegularDynamic
{
public:
virtual void virtualFunction();
};
template<typename T>
class TemplateDerivedFromRegularDynamic : public RegularDynamic
{
public:
TemplateDerivedFromRegularDynamic();
~TemplateDerivedFromRegularDynamic();
};
template<typename T>
TemplateDerivedFromRegularDynamic<T>::TemplateDerivedFromRegularDynamic()
{
}
template<typename T>
TemplateDerivedFromRegularDynamic<T>::~TemplateDerivedFromRegularDynamic()
{
}
template <typename T>
class OnlySpecialisedInTypeArg
{
public:
DependentValueFields<OnlySpecialisedInTypeArg<T>> returnSelfSpecialization();
};
template <typename T>
DependentValueFields<OnlySpecialisedInTypeArg<T>> OnlySpecialisedInTypeArg<T>::returnSelfSpecialization()
{
return DependentValueFields<OnlySpecialisedInTypeArg<T>>();
}
enum class UsedInTemplatedIndexer
{
Item1,
Item2
};
template <typename T>
class QFlags
{
typedef int Int;
struct Private;
typedef int (Private::*Zero);
public:
QFlags(T t);
QFlags(Zero = nullptr);
operator Int();
private:
int flag;
};
template <typename T>
QFlags<T>::QFlags(T t) : flag(Int(t))
{
}
template <typename T>
QFlags<T>::QFlags(Zero) : flag(Int(0))
{
}
template <typename T>
QFlags<T>::operator Int()
{
return flag;
}
template <typename T>
class HasCtorWithMappedToEnum
{
public:
HasCtorWithMappedToEnum(T t);
HasCtorWithMappedToEnum(QFlags<T> t);
};
template <typename T>
HasCtorWithMappedToEnum<T>::HasCtorWithMappedToEnum(T t)
{
}
template <typename T>
HasCtorWithMappedToEnum<T>::HasCtorWithMappedToEnum(QFlags<T> t)
{
}
template <typename T>
class AbstractTemplate
{
public:
virtual int property() = 0;
virtual int callFunction() = 0;
};
class DLL_API ImplementAbstractTemplate : public AbstractTemplate<int>
{
public:
int property() override;
int callFunction() override;
};
enum class TestFlag
{
Flag1,
Flag2
};
// we optimise specialisations so that only actually used ones are wrapped
void forceUseSpecializations(IndependentFields<int> _1, IndependentFields<bool> _2,
IndependentFields<T1> _3, IndependentFields<std::string> _4,
DependentValueFields<int> _5,
VirtualTemplate<int> _6, VirtualTemplate<bool> _7,
HasDefaultTemplateArgument<int, int> _8, DerivedChangesTypeName<T1> _9,
TemplateWithIndexer<int> _10, TemplateWithIndexer<T1> _11,
TemplateWithIndexer<void*> _12, TemplateWithIndexer<UsedInTemplatedIndexer> _13,
TemplateDerivedFromRegularDynamic<RegularDynamic> _14,
IndependentFields<OnlySpecialisedInTypeArg<double>> _15,
DependentPointerFields<float> _16, IndependentFields<const T1&> _17,
TemplateWithIndexer<T2*> _18, IndependentFields<int(*)(int)> _19,
TemplateWithIndexer<const char*> _20, VirtualDependentValueFields<int> _21,
VirtualDependentValueFields<float> _22, VirtualDependentValueFields<const char*> _23,
std::string s);
void hasIgnoredParam(DependentValueFields<IndependentFields<Ignored>> ii, Base<void> _24);
std::map<int, int> usesValidSpecialisationOfIgnoredTemplate();
DLL_API DependentValueFields<double> specialiseReturnOnly();
template <int Size> void* qbswap(const void *source, size_t count, void *dest) noexcept;
template<> inline void* qbswap<1>(const void *source, size_t count, void *dest) noexcept
{
return 0;
}
class TestForwardedClassInAnotherUnit;
// Forward declaration of class as friend
template<class T> class ForwardTemplateFriendClassContainer;
template<class T> class ForwardTemplateFriendClass;
template<class T>
class ForwardTemplateFriendClassContainer
{
template<class K> friend class ForwardTemplateFriendClass;
};
template<class T>
class ForwardTemplateFriendClass
{
protected:
ForwardTemplateFriendClass() { }
};
class ForwardTemplateFriendClassUser : public ForwardTemplateFriendClass<ForwardTemplateFriendClassUser>
{ };
template<int I>
class ClassWithNonTypeTemplateArgument
{
public:
ClassWithNonTypeTemplateArgument() { }
private:
union
{
int i;
DependentValueFields<TestFlag> d;
};
};
class SpecializationOfClassWithNonTypeTemplateArgument : public ClassWithNonTypeTemplateArgument<0>
{ };
template<std::size_t N>
class DLL_API FloatArrayF
{
public:
template<typename... V, class = typename std::enable_if_t<sizeof...(V) == N>>
FloatArrayF(V... x) { }
};
const FloatArrayF<6> I6{ 1., 1., 1., 0., 0., 0. };
template <typename T>
DLL_API inline T FunctionTemplate(T value) {
if (std::is_same<T, double>::value)
return 4.2 + value;
else if (std::is_same<T, float>::value)
return 4.1 + value;
return 4 + value;
}
inline void FunctionTemplateInstantiation()
{
FunctionTemplate<double>({});
FunctionTemplate<float>({});
FunctionTemplate<int>({});
}
// KEEP ORDER OTHERWISE TEST WONT WORK
namespace IncompleteClassTemplatesTests
{
template <size_t Size>
struct StructSizeT {};
template <typename T>
struct StructT
{
template<typename U>
struct Inc { };
};
struct Instantiation
{
StructT<StructSizeT<4000>> st;
};
}