mirror of https://github.com/mono/CppSharp.git
				
				
			
		c-sharpdotnetmonobindingsbridgecclangcpluspluscppsharpglueinteropparserparsingpinvokeswigsyntax-treevisitorsxamarinxamarin-bindings
		
		
		
		
			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
						
					
					
				
			
		
		
	
	
							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; | 
						|
    }; | 
						|
}
 | 
						|
 |