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.
 
 
 
 
 

289 lines
4.9 KiB

#if defined(_MSC_VER)
#define DLL_API __declspec(dllexport)
#else
#define DLL_API
#endif
#define CS_OUT
class DLL_API Foo
{
public:
Foo();
int A;
float B;
const char* GetANSI();
// TODO: VC++ does not support char16
// char16 chr16;
};
struct DLL_API Bar
{
enum Item
{
Item1,
Item2
};
Bar();
Item RetItem1();
int A;
float B;
Bar* returnPointerToValueType();
};
class DLL_API Foo2 : public Foo
{
struct Copy {
Foo A;
}* copy;
public:
int C;
Foo2 operator<<(signed int i);
Foo2 operator<<(signed long l);
Bar valueTypeField;
};
DLL_API Bar::Item operator |(Bar::Item left, Bar::Item right);
struct DLL_API Bar2 : public Bar
{
// Conversion operators
struct DLL_API Nested
{
operator int() const;
};
operator int() const;
operator Foo2();
Foo2 needFixedInstance() const;
typedef void *Bar2::*FunctionPointerResolvedAsVoidStar;
operator FunctionPointerResolvedAsVoidStar() const { return 0; }
int C;
Bar* pointerToStruct;
int* pointerToPrimitive;
Foo2* pointerToClass;
Bar valueStruct;
};
enum Enum
{
A = 0, B = 2, C = 5,
D = 0x80000000,
E = 0x1,
F = -9
};
class DLL_API Hello
{
union NestedPrivate {
int i;
float f;
};
public:
union NestedPublic {
int j;
float g;
long l;
};
Hello ();
Hello(const Hello& hello);
void PrintHello(const char* s);
bool test1(int i, float f);
int add(int a, int b);
int AddFoo(Foo);
int AddFooRef(Foo&);
int AddFooPtr(Foo*);
int AddFooPtrRef(Foo*&);
Foo RetFoo(int a, float b);
int AddFoo2(Foo2);
int AddBar(Bar);
int AddBar2(Bar2);
int RetEnum(Enum);
Hello* RetNull();
bool TestPrimitiveOut(CS_OUT float* f);
bool TestPrimitiveOutRef(CS_OUT float& f);
};
class DLL_API AbstractFoo
{
public:
virtual int pureFunction(int i) = 0;
virtual int pureFunction1() = 0;
virtual int pureFunction2() = 0;
};
class DLL_API ImplementsAbstractFoo : public AbstractFoo
{
public:
virtual int pureFunction(int i);
virtual int pureFunction1();
virtual int pureFunction2();
};
class DLL_API ReturnsAbstractFoo
{
public:
const AbstractFoo& getFoo();
private:
ImplementsAbstractFoo i;
};
int DLL_API unsafeFunction(const Bar& ret, char* testForString, void (*foo)(int));
DLL_API Bar indirectReturn();
// Tests CheckVirtualOverrideReturnCovariance
struct Exception;
typedef Exception Ex1;
struct DerivedException;
typedef DerivedException Ex2;
struct DLL_API Exception
{
virtual Ex1* clone() = 0;
};
struct DLL_API DerivedException : public Exception
{
virtual Ex2* clone() override { return 0; }
};
// Tests for ambiguous call to native functions with default parameters
struct DLL_API DefaultParameters
{
void Foo(int a, int b = 0);
void Foo(int a);
void Bar() const;
void Bar();
};
// The Curiously Recurring Template Pattern (CRTP)
template<class Derived>
class Base
{
// methods within Base can use template to access members of Derived
Derived* create() { return new Derived(); }
};
class Derived : public Base<Derived>
{
};
// Tests the MoveFunctionToClassPass
class DLL_API basic
{
};
DLL_API int test(basic& s);
// Tests the MoveOperatorToClassPass
struct DLL_API TestMoveOperatorToClass
{
TestMoveOperatorToClass() {}
int A;
int B;
};
DLL_API int operator *(TestMoveOperatorToClass klass, int b)
{
return klass.A * b;
}
DLL_API TestMoveOperatorToClass operator-(const TestMoveOperatorToClass& b)
{
TestMoveOperatorToClass nb;
nb.A = -b.A;
nb.B = -b.B;
return nb;
}
DLL_API TestMoveOperatorToClass operator+(const TestMoveOperatorToClass& b1,
const TestMoveOperatorToClass& b2)
{
TestMoveOperatorToClass b;
b.A = b1.A + b2.A;
b.B = b1.B + b2.B;
return b;
}
// Tests delegates
typedef int (*DelegateInGlobalNamespace)(int);
struct DLL_API TestDelegates
{
typedef int (*DelegateInClass)(int);
TestDelegates() : A(Double), B(Double) {}
static int Double(int N) { return N * 2; }
DelegateInClass A;
DelegateInGlobalNamespace B;
};
// Tests memory leaks in constructors
// C#: Marshal.FreeHGlobal(arg0);
struct DLL_API TestMemoryLeaks
{
TestMemoryLeaks(const char* name) {}
};
// Tests that finalizers are generated
/* CLI: ~TestFinalizers() */
struct DLL_API TestFinalizers
{
};
// Tests static classes
struct DLL_API TestStaticClass
{
static int Add(int a, int b) { return a + b; }
private:
TestStaticClass();
};
class HasIgnoredField
{
Base<Derived> fieldOfIgnoredType;
};
template <typename T>
class DependentTypeWithNestedIndependent
{
union
{
int i;
long l;
};
};
class DLL_API TestCopyConstructorRef
{
public:
TestCopyConstructorRef();
TestCopyConstructorRef(const TestCopyConstructorRef& other);
int A;
float B;
};