Демонстрационный файл определения библиотеки C++

Этот пример показывает файл определения библиотеки, созданный из заголовочного файла C++.

Заголовочный файл в качестве примера

Этот заголовочный файл в качестве примера содержит построения языка C++, которым нужно дальнейшее определение от издателя для того, чтобы создать интерфейс MATLAB к библиотеке.

type cppUseCases.hpp
/*
 * cppUseCases.hpp
 *
 * Copyright 2019 The MathWorks, Inc.
 */
 
#ifndef cppUseCases_hpp
#define cppUseCases_hpp
#include <string>

 // classes
 // enums
 // functions
 // typedefs
 // templates
 // member functions
 // constructors
 // data members
 // functions with pointers, reference for non fundamental types
 // functions with pointers, reference, boxed Arr for fundamental types
 // functions with const char *, char *, std::string
 // explicit instantiation
 // implicit instantiation
 // functions with std::size_t, std::uint8_t inputs
 // typedefs to value types and non-value types


namespace ns {

    class EmptyClass {};
    enum MyEnum1 { en1 = 1, en2, en4 = 4 };

    class MyClass1 {
    public:
        int fundamentalProp;
        const int constProp = 5;
        bool boolProp;
        std::string strProp;
        EmptyClass nonFundamentalProp;
        MyEnum1 enumProp;

        MyClass1() {}
        MyClass1(const MyClass1& myc1) {
            this->fundamentalProp = myc1.fundamentalProp;
            this->boolProp = myc1.boolProp;
            this->strProp = myc1.strProp;
            this->nonFundamentalProp = myc1.nonFundamentalProp;
            this->enumProp = myc1.enumProp;
        }

        void setFundamentalProp(const int& fundProp);
    };

    class MyClass2 {
    public:
        double a;
        short b;
        long c;
    };
}

ns::MyEnum1 getMyEnum1Copy(ns::MyEnum1 en);

ns::MyClass1 getMyClass1Copy(ns::MyClass1 myc1);

// shape
double addClassByPtr(const ns::MyClass2* myc2);

double addClassByRef(const ns::MyClass2& myc2);

// direction

// inout
void updateClassByPtr(ns::MyClass2* myc2, double a, short b, long c);

void updateClassByRef(ns::MyClass2& myc2, double a, short b, long c);

// in
void readClassByPtr(ns::MyClass2* myc2);

void readClassByRef(ns::MyClass2& myc2);

// out
void fillClassByPtr(ns::MyClass2* myc2, double a, short b, long c);

void fillClassByRef(ns::MyClass2& myc2, double a, short b, long c);

// cases for shapes
void readScalarPtr(const int * in); // len = 1

void readScalarPtr(const ns::MyClass2 * in); // len = 1

void readMatrix1DPtr(const int * mat, size_t m);

void readMatrix1DPtrFixedSize(const int * mat); // fixed size = 5

void readMatrix2DPtr(const int * mat, size_t m, size_t n);

void readMatrix2DPtrFixedSize(const int * mat); // fixed size = 5

void readMatrix3DPtr(const int * mat, size_t m, size_t n, size_t p);

void readMatrix1DFixedArr(const int mat[5]);

void readMatrix2DFixedArr(const int mat[5][5]);

void readMatrix3DFixedArr(const int mat[5][5][5]);

void readMatrix1DArr(const int mat[], size_t len);

const int * getRandomValues(size_t len);

int * getRandomValuesFixedSize(); // fixed size = 5

// cases for direction

// inout
void updateMatrix1DPtrByX(int * mat, size_t len, int x);

void updateMatrix1DArrByX(int mat[], size_t len, int x);

void swap(int & a, int & b);

// in
int addValuesByPtr(int * mat, size_t len);

int addValuesByArr(int mat[], size_t len);

void readString(std::string & str);

// out
void fillRandomValuesToPtr(int * mat, size_t len);

void fillRandomValuesToArr(int mat[], size_t len);

void fillString(std::string & str);

// cases for type and shape

const char * getStringCopy(const char * str);

void readCharArray(const char * chArray, size_t len);

void readInt8Array(const char * int8Array, size_t len);

const char * getRandomCharScalar();

const char * getRandomInt8Scalar();

void updateCharArray(char * chArray, size_t len);

// template prototype
template <typename T>
class templClass {};

// explicit instantiation
template class templClass<int>;

// implicit instantiation
void useTemplClass(templClass<double> in) {}

// template with non-type parameter
template <int size>
class my_int_array {
public:
    int arr[size];
};

// explicit instantiation
template class my_int_array<4>;
void useTemplClassNonType(my_int_array<4> intArr4);

void useMixedTypes(std::size_t, std::int16_t, std::uint64_t);

// typedefs
typedef int16_t intData;
typedef intData * intDataPtr;

using clsData = ns::MyClass1;
using clsDataRef = clsData &;

void useTypedef(intData);
void useTypedefPtr(intDataPtr);
void useTypedefToClass(clsData);
void useTypedefRef(clsDataRef);
void useTypedefConstRef(const clsData &);

#endif

Файл Определения библиотеки definecppUseCases.mlx

После генерации файла определения библиотеки, замена <SHAPE>, <НАПРАВЛЕНИЕ> и <MLTYPE> со значениями так, чтобы MATLAB мог создать соответствующие функциональные подписи. Для получения дополнительной информации о предоставлении этой информации, смотрите, Задают Интерфейс MATLAB к Библиотеке C++.

edit definecppUseCases.mlx