 |
LibraryLink Utilities
3.0.1
Modern C++ wrapper over LibraryLink and WSTP
|
Go to the documentation of this file.
9 #ifndef LLU_MARGUMENTMANAGER_H
10 #define LLU_MARGUMENTMANAGER_H
17 #include <type_traits>
73 MArgumentManager(WolframLibraryData ld, mint Argc, MArgument* Args, MArgument& Res);
137 template<
typename T, Passing Mode = Passing::Automatic>
146 template<Passing Mode = Passing::Automatic>
166 template<
typename T, Passing Mode = Passing::Automatic>
175 template<Passing Mode = Passing::Automatic>
194 template<
typename T, Passing Mode = Passing::Automatic>
203 template<Passing Mode = Passing::Automatic>
223 template<
typename T, Passing Mode = Passing::Automatic>
232 template<Passing Mode = Passing::Automatic>
252 template<
typename T, Passing Mode = Passing::Automatic>
261 template<Passing Mode = Passing::Automatic>
281 template<
class ManagedExpr,
class DynamicType = ManagedExpr>
292 template<
class ManagedExpr,
class DynamicType = ManagedExpr>
302 template<
class Container, Passing Mode>
307 struct RequestedTypeImpl {
311 template<
class Container, Passing P>
312 struct RequestedTypeImpl<Managed<Container, P>> {
313 using type = Container;
329 if constexpr (std::is_integral_v<T>) {
330 return getInteger<T>(index);
341 template<
typename... ArgTypes>
343 const auto indices = getOffsets(index, std::array<
size_type,
sizeof...(ArgTypes)> {getArgSlotCount<std::remove_cv_t<ArgTypes>>()...});
344 return MArgPackGetter<ArgTypes...>::template getImpl(*
this, indices, std::index_sequence_for<ArgTypes...>{});
353 template<
typename... ArgTypes>
354 std::tuple<RequestedType<ArgTypes>...>
getTuple(std::array<
size_type,
sizeof...(ArgTypes)> indices)
const {
355 return MArgPackGetter<ArgTypes...>::template getImpl(*
this, indices, std::index_sequence_for<ArgTypes...>{});
370 void setReal(
double result) noexcept;
392 void setComplex(std::complex<double> c) noexcept;
479 void set(
bool result) noexcept {
484 void set(
double result) noexcept {
489 void set(mint result) noexcept {
494 void set(std::complex<double> c) noexcept {
499 void set(
const std::string& str) {
504 void set(
const char* str) {
509 void set(std::string&& str) {
621 template<
Passing Mode,
class Operator,
class... OpArgs>
632 template<Passing Mode = Passing::Automatic,
class Operator>
654 template<
Passing Mode,
class Operator,
class... Args>
666 template<Passing Mode = Passing::Automatic,
class Operator>
688 template<
Passing Mode,
class Operator,
class... Args>
700 template<Passing Mode = Passing::Automatic,
class Operator>
734 if constexpr (isCustomMArgumentType<T>) {
735 return DefaultCustomGetter<T, typename CustomType<T>::CorrespondingTypes>
::get(mngr, firstIndex);
737 static_assert(dependent_false_v<T>,
"Unrecognized MArgument type passed as template parameter to MArgumentManager::get.");
752 static_assert(dependent_false_v<T>,
"Unrecognized MArgument type passed as template parameter to MArgumentManager::set.");
757 template<
typename... ArgTypes>
758 struct MArgPackGetter {
760 static std::tuple<ArgTypes...>
761 getImpl(
const MArgumentManager& mngr, std::array<
size_type,
sizeof...(ArgTypes)> inds, std::index_sequence<Indices...> ) {
762 if (
sizeof...(ArgTypes) >
static_cast<size_type>(mngr.argc)) {
765 return {mngr.
get<ArgTypes>(inds[Indices])...};
769 template<
typename,
typename>
770 struct DefaultCustomGetter;
771 template<
typename T,
typename... Args>
772 struct DefaultCustomGetter<T, std::tuple<Args...>> {
774 return std::make_from_tuple<T>(mngr.getTuple<Args...>(firstIndex));
779 struct CustomMArgumentTypeDetector {
781 static std::true_type isSpecialized(
typename CustomType<U>::CorrespondingTypes* ) {
return {}; }
784 static std::false_type isSpecialized(...) {
return {}; }
786 static constexpr
bool value = decltype(isSpecialized<T>(
nullptr))::value;
790 static constexpr
bool isCustomMArgumentType = CustomMArgumentTypeDetector<T>::value;
793 static constexpr
size_type getArgSlotCount() {
794 if constexpr (isCustomMArgumentType<T>) {
795 return std::tuple_size_v<typename CustomType<T>::CorrespondingTypes>;
801 static std::array<size_type, N> getOffsets(
size_t I0, std::array<size_type, N> a) {
802 if constexpr (N == 0) {
805 std::array<size_type, N> offsets = {I0};
806 for (
size_t i = 1; i < N; ++i) {
807 offsets[i] = offsets[i - 1] + a[i - 1];
817 using LLStringPtr = std::unique_ptr<
char[], decltype(st_WolframLibraryData::UTF8String_disown)>;
824 MArgument getArgs(
size_type index)
const;
829 void initStringArgs();
839 void acquireUTF8String(
size_type index)
const;
847 if (m == Passing::Manual) {
850 if (m == Passing::Shared) {
859 static std::string stringResultBuffer;
862 static constexpr mint MINT_MAX = (std::numeric_limits<mint>::max)();
865 static constexpr mint MINT_MIN = (std::numeric_limits<mint>::min)();
879 mutable std::vector<LLStringPtr> stringArgs;
885 return static_cast<T
>(MArgument_getInteger(getArgs(index)));
888 #define LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION(type, getFunction) \
890 inline type MArgumentManager::get<type>(size_type index) const { \
891 return getFunction(index); \
894 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION(
bool, getBoolean)
895 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION(
double, getReal)
896 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION(std::string, getString)
897 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION(
const char*, getCString)
898 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION(std::complex<double>, getComplex)
900 #undef LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION
902 #define LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION_FOR_CONTAINER(Container) \
903 template<typename T> \
904 struct MArgumentManager::Getter<Container<T>> { \
905 static Container<T> get(const MArgumentManager& mngr, size_type index) { \
906 return mngr.get##Container<T, Passing::Automatic>(index); \
909 template<typename T, Passing Mode> \
910 struct MArgumentManager::Getter<MArgumentManager::Managed<Container<T>, Mode>> { \
911 static Container<T> get(const MArgumentManager& mngr, size_type index) { \
912 return mngr.get##Container<T, Mode>(index); \
916 struct MArgumentManager::Getter<Generic##Container> { \
917 static Generic##Container get(const MArgumentManager& mngr, size_type index) { \
918 return mngr.getGeneric##Container<Passing::Automatic>(index); \
921 template<Passing Mode> \
922 struct MArgumentManager::Getter<MArgumentManager::Managed<Generic##Container, Mode>> { \
923 static Generic##Container get(const MArgumentManager& mngr, size_type index) { \
924 return mngr.getGeneric##Container<Mode>(index); \
928 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION_FOR_CONTAINER(NumericArray)
929 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION_FOR_CONTAINER(Tensor)
930 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION_FOR_CONTAINER(Image)
931 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION_FOR_CONTAINER(DataList)
932 LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION_FOR_CONTAINER(SparseArray)
934 #undef LLU_MARGUMENTMANAGER_GENERATE_GET_SPECIALIZATION_FOR_CONTAINER
938 if (result >= MINT_MAX) {
939 setInteger(MINT_MAX);
942 if (result <= MINT_MIN) {
943 setInteger(MINT_MIN);
950 template<
typename T, Passing Mode>
952 return NumericArray<T> { getGenericNumericArray<Mode>(index) };
960 template<
Passing Mode,
class Operator,
class... Args>
964 case MNumericArray_Type_Bit8: op(this->getNumericArray<int8_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
965 case MNumericArray_Type_UBit8: op(this->getNumericArray<uint8_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
966 case MNumericArray_Type_Bit16: op(this->getNumericArray<int16_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
967 case MNumericArray_Type_UBit16: op(this->getNumericArray<uint16_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
968 case MNumericArray_Type_Bit32: op(this->getNumericArray<int32_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
969 case MNumericArray_Type_UBit32: op(this->getNumericArray<uint32_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
970 case MNumericArray_Type_Bit64: op(this->getNumericArray<int64_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
971 case MNumericArray_Type_UBit64: op(this->getNumericArray<uint64_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
972 case MNumericArray_Type_Real32: op(this->getNumericArray<float, Mode>(index), std::forward<Args>(opArgs)...);
break;
973 case MNumericArray_Type_Real64: op(this->getNumericArray<double, Mode>(index), std::forward<Args>(opArgs)...);
break;
974 case MNumericArray_Type_Complex_Real32: op(this->
getNumericArray<std::complex<float>, Mode>(index), std::forward<Args>(opArgs)...);
break;
975 case MNumericArray_Type_Complex_Real64: op(this->
getNumericArray<std::complex<double>, Mode>(index), std::forward<Args>(opArgs)...);
break;
978 "Incorrect type of NumericArray argument. Argument index: " + std::to_string(index));
982 template<Passing Mode,
class Operator>
985 case MNumericArray_Type_Bit8: op(this->getNumericArray<int8_t, Mode>(index));
break;
986 case MNumericArray_Type_UBit8: op(this->getNumericArray<uint8_t, Mode>(index));
break;
987 case MNumericArray_Type_Bit16: op(this->getNumericArray<int16_t, Mode>(index));
break;
988 case MNumericArray_Type_UBit16: op(this->getNumericArray<uint16_t, Mode>(index));
break;
989 case MNumericArray_Type_Bit32: op(this->getNumericArray<int32_t, Mode>(index));
break;
990 case MNumericArray_Type_UBit32: op(this->getNumericArray<uint32_t, Mode>(index));
break;
991 case MNumericArray_Type_Bit64: op(this->getNumericArray<int64_t, Mode>(index));
break;
992 case MNumericArray_Type_UBit64: op(this->getNumericArray<uint64_t, Mode>(index));
break;
993 case MNumericArray_Type_Real32: op(this->getNumericArray<float, Mode>(index));
break;
994 case MNumericArray_Type_Real64: op(this->getNumericArray<double, Mode>(index));
break;
995 case MNumericArray_Type_Complex_Real32: op(this->
getNumericArray<std::complex<float>, Mode>(index));
break;
996 case MNumericArray_Type_Complex_Real64: op(this->
getNumericArray<std::complex<double>, Mode>(index));
break;
999 "Incorrect type of NumericArray argument. Argument index: " + std::to_string(index));
1003 template<
typename T, Passing Mode>
1005 return Tensor<T> { getGenericTensor<Mode>(index) };
1008 template<
typename T>
1013 template<
Passing Mode,
class Operator,
class... Args>
1017 case MType_Integer: op(this->getTensor<mint, Mode>(index), std::forward<Args>(opArgs)...);
break;
1018 case MType_Real: op(this->getTensor<double, Mode>(index), std::forward<Args>(opArgs)...);
break;
1019 case MType_Complex: op(this->
getTensor<std::complex<double>, Mode>(index), std::forward<Args>(opArgs)...);
break;
1022 "Incorrect type of Tensor argument. Argument index: " + std::to_string(index));
1026 template<Passing Mode,
class Operator>
1029 case MType_Integer: op(this->getTensor<mint, Mode>(index));
break;
1030 case MType_Real: op(this->getTensor<double, Mode>(index));
break;
1031 case MType_Complex: op(this->
getTensor<std::complex<double>, Mode>(index));
break;
1034 "Incorrect type of Tensor argument. Argument index: " + std::to_string(index));
1038 template<
typename T, Passing Mode>
1040 return Image<T> { getGenericImage<Mode>(index) };
1043 template<
typename T>
1048 template<
Passing Mode,
class Operator,
class... Args>
1052 case MImage_Type_Bit: op(this->getImage<int8_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
1053 case MImage_Type_Bit8: op(this->getImage<uint8_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
1054 case MImage_Type_Bit16: op(this->getImage<uint16_t, Mode>(index), std::forward<Args>(opArgs)...);
break;
1055 case MImage_Type_Real32: op(this->getImage<float, Mode>(index), std::forward<Args>(opArgs)...);
break;
1056 case MImage_Type_Real: op(this->getImage<double, Mode>(index), std::forward<Args>(opArgs)...);
break;
1059 "Incorrect type of Image argument. Argument index: " + std::to_string(index));
1063 template<Passing Mode,
class Operator>
1066 case MImage_Type_Bit: op(std::move(this->getImage<int8_t, Mode>(index)));
break;
1067 case MImage_Type_Bit8: op(this->getImage<uint8_t, Mode>(index));
break;
1068 case MImage_Type_Bit16: op(this->getImage<uint16_t, Mode>(index));
break;
1069 case MImage_Type_Real32: op(this->getImage<float, Mode>(index));
break;
1070 case MImage_Type_Real: op(this->getImage<double, Mode>(index));
break;
1073 "Incorrect type of Image argument. Argument index: " + std::to_string(index));
1077 template<
typename T, Passing Mode>
1079 return DataList<T>(getGenericDataList<Mode>(index));
1082 template<
typename T>
1087 template<Passing Mode>
1092 template<Passing Mode>
1097 template<Passing Mode>
1099 return {
getMImage(index), getOwner(Mode)};
1102 template<Passing Mode>
1104 static_assert(Mode != Passing::Shared,
"DataStore cannot be passed as \"Shared\".");
1108 template<
typename T, Passing Mode>
1110 return SparseArray<T> { getGenericSparseArray<Mode>(index) };
1113 template<
typename T>
1118 template<Passing Mode>
1123 template<
class ManagedExpr,
class DynamicType>
1125 auto ptr = getManagedExpressionPtr<ManagedExpr, DynamicType>(index, store);
1132 template<
class ManagedExpr,
class DynamicType>
1134 auto exprID = getInteger<mint>(index);
1135 auto baseClassPtr = store.getInstancePointer(exprID);
1136 return std::dynamic_pointer_cast<DynamicType>(baseClassPtr);
1141 #endif // LLU_MARGUMENTMANAGER_H
void set(const GenericNumericArray &na)
Set MNumericArray wrapped by na as output MArgument.
Definition: MArgumentManager.h:523
static void throwExceptionWithDebugInfo(const std::string &errorName, const std::string &debugInfo, T &&... args)
Throw exception with given name and additional information that might be helpful in debugging.
Definition: ErrorManager.h:214
SparseArray< T > getSparseArray(size_type index) const
Get MArgument of type MSparseArray at position index and wrap it into SparseArray.
void set(bool result) noexcept
Set result as output MArgument.
Definition: MArgumentManager.h:479
void setImage(const Image< T > &im)
Set MImage wrapped by im as output MArgument.
void operateOnNumericArray(size_type index, Operator &&op)
Perform operation on NumericArray created from MNumericArray argument at position index in Args.
std::complex< double > getComplex(size_type index) const
Get MArgument of type mcomplex at position index.
Definition: MArgumentManager.cpp:95
bool setMintAndCheck(T result) noexcept
Set result as output MArgument and check for overflow.
Templated C++ wrapper for MNumericArray.
This is a class template, where template parameter T is the type of data elements....
Definition: NumericArray.h:54
void set(const std::string &str)
Set str as output MArgument.
Definition: MArgumentManager.h:499
MContainer specialization for DataStore, provides basic list interface for the underlying raw DataSto...
Definition: Generic/DataStore.hpp:23
MContainer specialization for MNumericArray.
Definition: Generic/NumericArray.hpp:23
GenericTensor getGenericTensor(size_type index) const
Get MArgument of type MTensor at position index and wrap it into generic MContainer wrapper.
MContainer< MArgumentType::NumericArray > GenericNumericArray
MContainer specialization for MNumericArray is called GenericNumericArray.
Definition: Generic/NumericArray.hpp:17
GenericNumericArray getGenericNumericArray(size_type index) const
Get MArgument of type MNumericArray at position index and wrap it into generic MContainer wrapper.
MContainer< MArgumentType::Image > GenericImage
MContainer specialization for MImage is called GenericImage.
Definition: Generic/Image.hpp:17
Main namespace of LibraryLink Utilities.
Definition: Queue.h:13
MContainer< MArgumentType::DataStore > GenericDataList
MContainer specialization for DataStore is called GenericDataList.
Definition: Generic/DataStore.hpp:17
This is a class template, where template parameter T is the type of data elements....
Definition: Image.h:127
void operateOnImage(size_type index, Operator &&op)
Perform operation on Image created from MImage argument at position index in Args.
Image< T > getImage(size_type index) const
Get MArgument of type MImage at position index and wrap it into Image object.
Passing
Enumerated type representing different modes in which a container can be passed from LibraryLink to t...
Definition: MArgumentManager.h:38
ProgressMonitor getProgressMonitor(double step=ProgressMonitor::getDefaultStep()) const
Get ProgressMonitor shared with WL Kernel.
Definition: MArgumentManager.cpp:178
MContainer specialization for MSparseArray.
Definition: SparseArray.hpp:23
void operateOnTensor(size_type index, Args &&... opArgs)
Perform operation on Tensor created from MTensor argument at position index in Args.
void set(const GenericDataList &ds)
Set DataStore wrapped by ds as output MArgument.
Definition: MArgumentManager.h:579
void set(std::string &&str)
Set str as output MArgument.
Definition: MArgumentManager.h:509
RequestedType< T > get(size_type index) const
Extract library function argument at given index and convert it from MArgument to a desired type.
Definition: MArgumentManager.h:328
@ Shared
When the container is shared LLU only needs to decrease share count when it's done....
void setInteger(mint result) noexcept
Set result as output MArgument.
Definition: MArgumentManager.cpp:91
void setNumericArray(const NumericArray< T > &na)
Set MNumericArray wrapped by na as output MArgument.
DataList< T > getDataList(size_type index) const
Get DataStore with all nodes of the same type from MArgument at position index.
void operateOnImage(size_type index, Args &&... opArgs)
Perform operation on Image created from MImage argument at position index in Args.
void set(const NumericArray< T > &na)
Set MNumericArray wrapped by na as output MArgument.
Definition: MArgumentManager.h:515
void set(const GenericImage &im)
Set MImage wrapped by im as output MArgument.
Definition: MArgumentManager.h:565
const std::string MArgumentIndexError
wrong argument index
Helper structure to fully customize the way MArgumentManager reads T as argument type.
Definition: MArgumentManager.h:725
Helper struct to "attach" a passing mode to container type when passing it as template argument to MA...
Definition: MArgumentManager.h:303
MArgumentManager(mint Argc, MArgument *Args, MArgument &Res)
Constructor.
Definition: MArgumentManager.cpp:25
T getInteger(size_type index) const
Get MArgument of type mint at position index with extra static_cast if needed.
void setSparseArray(const SparseArray< T > &sa)
Set MSparseArray wrapped by sa as output MArgument.
Helper structure to fully customize the way MArgumentManager sets an object of type T as result of a ...
Definition: MArgumentManager.h:748
const std::string MArgumentTensorError
error involving Tensor argument
void set(const GenericTensor &t)
Set MTensor wrapped by t as output MArgument.
Definition: MArgumentManager.h:551
MNumericArray getMNumericArray(size_type index) const
Get MArgument of type MNumericArray at position index.
Definition: MArgumentManager.cpp:105
void setMSparseArray(MSparseArray sa)
Set MSparseArray as output MArgument.
Definition: MArgumentManager.cpp:143
void set(std::complex< double > c) noexcept
Set c as output MArgument.
Definition: MArgumentManager.h:494
MContainer specialization for MImage.
Definition: Generic/Image.hpp:23
unsigned char getTensorType(size_type index) const
Get type of MTensor at position index in Args.
Definition: MArgumentManager.cpp:152
This is a class template, where template parameter T is the type of data elements....
Definition: Tensor.h:53
MContainer< MArgumentType::Tensor > GenericTensor
MContainer specialization for MTensor is called GenericTensor.
Definition: Generic/Tensor.hpp:18
void setTensor(const Tensor< T > &ten)
Set MTensor wrapped by ten as output MArgument.
@ Library
The library (LLU) is responsible for managing the container's memory. Used for Manual passing and con...
void set(const SparseArray< T > &ten)
Set MSparseArray wrapped by sa as output MArgument.
Definition: MArgumentManager.h:529
double getReal(size_type index) const
Get MArgument of type mreal at position index.
Definition: MArgumentManager.cpp:40
void setComplex(std::complex< double > c) noexcept
Set c as output MArgument.
Definition: MArgumentManager.cpp:100
void set(const T &arg)
Set given value as a result of the library function.
Definition: MArgumentManager.h:588
Definition of the ManagedExpressionStore class template which provides C++ API for the Managed Expres...
void setMImage(MImage im)
Set MImage as output MArgument.
Definition: MArgumentManager.cpp:134
MSparseArray getMSparseArray(size_type index) const
Get MArgument of type MSparseArray at position index.
Definition: MArgumentManager.cpp:122
void set(const Image< T > &im)
Set MImage wrapped by im as output MArgument.
Definition: MArgumentManager.h:557
void set(double result) noexcept
Set result as output MArgument.
Definition: MArgumentManager.h:484
void pass(MArgument &res) const
Pass the internal container as result of a LibraryLink function.
Definition: Base.hpp:126
Definition of the ErrorManager class responsible for error registration and throwing.
Tensor< T > getTensor(size_type index) const
Get MArgument of type MTensor at position index and wrap it into Tensor object.
std::tuple< RequestedType< ArgTypes >... > getTuple(size_type index=0) const
Extract arguments from the Manager and return them as values of given types.
Definition: MArgumentManager.h:342
Top-level wrapper over LibraryLink's DataStore.
Definition: DataList.h:36
Templated C++ wrapper for MImage.
bool getBoolean(size_type index) const
Get MArgument of type mbool at position index.
Definition: MArgumentManager.cpp:36
GenericDataList getGenericDataList(size_type index) const
Get MArgument of type DataStore at position index and wrap it into generic MContainer wrapper.
GenericSparseArray getGenericSparseArray(size_type index) const
Get MArgument of type MSparseArray at position index and wrap it into generic MContainer wrapper.
Helper structure that can be used to register user-defined argument types in LLU.
Definition: MArgumentManager.h:713
void operateOnTensor(size_type index, Operator &&op)
Perform operation on Tensor created from MTensor argument at position index in Args.
numericarray_data_t getNumericArrayType(size_type index) const
Get type of MNumericArray at position index in Args.
Definition: MArgumentManager.cpp:147
void setDataList(const DataList< T > &ds)
Set DataStore wrapped in DataList ds as output MArgument.
void setBoolean(bool result) noexcept
Set result as output MArgument.
Definition: MArgumentManager.cpp:83
static void throwException(const std::string &errorName, T &&... args)
Throw exception with given name.
Definition: ErrorManager.h:199
std::string getString(size_type index) const
Get value of MArgument of type "UTF8String" at position index.
Definition: MArgumentManager.cpp:56
void set(const DataList< T > &ds)
Set DataStore wrapped in DataList ds as output MArgument.
Definition: MArgumentManager.h:571
Templated C++ wrapper for MSparseArray.
static T get(const MArgumentManager &mngr, size_type firstIndex)
A function that tells LLU how to interpret an object of a user-defined type as an argument of a libra...
Definition: MArgumentManager.h:733
MContainer< MArgumentType::SparseArray > GenericSparseArray
MContainer specialization for MSparseArray is called GenericSparseArray.
Definition: SparseArray.hpp:17
void setMNumericArray(MNumericArray na)
Set MNumericArray as output MArgument.
Definition: MArgumentManager.cpp:126
const std::string MArgumentImageError
error involving Image argument
MImage getMImage(size_type index) const
Get MArgument of type MImage at position index.
Definition: MArgumentManager.cpp:113
GenericImage getGenericImage(size_type index) const
Get MArgument of type MImage at position index and wrap it into generic MContainer wrapper.
static constexpr double getDefaultStep() noexcept
Return default step for the ProgressMonitor.
Definition: ProgressMonitor.h:107
std::size_t size_type
Size type for indexing the list of arguments that MArgumentManager manages.
Definition: MArgumentManager.h:55
imagedata_t getImageType(size_type index) const
Get type of MImage at position index in Args.
Definition: MArgumentManager.cpp:157
NumericArray< T > getNumericArray(size_type index) const
Get MArgument of type MNumericArray at position index and wrap it into NumericArray.
void set(const char *str)
Set str as output MArgument.
Definition: MArgumentManager.h:504
MContainer specialization for MTensor.
Definition: Generic/Tensor.hpp:24
void operateOnNumericArray(size_type index, OpArgs &&... opArgs)
Perform operation on NumericArray created from MNumericArray argument at position index in Args.
Strongly typed wrapper for MSparseArray.
Definition: SparseArray.h:20
@ LibraryLink
LibraryLink is responsible for managing the container's memory. Corresponds to Automatic and "Constan...
std::shared_ptr< DynamicType > getManagedExpressionPtr(size_type index, ManagedExpressionStore< ManagedExpr > &store) const
Get a shared pointer to an instance of Managed Expression that was sent from Wolfram Language as argu...
Templated C++ wrapper for MTensor.
void set(const Tensor< T > &ten)
Set MTensor wrapped by ten as output MArgument.
Definition: MArgumentManager.h:543
Stores and updates current progress of computation in a location shared between the library and WL Ke...
Definition: ProgressMonitor.h:21
void setReal(double result) noexcept
Set result as output MArgument.
Definition: MArgumentManager.cpp:87
const std::string MArgumentNumericArrayError
error involving NumericArray argument
Template class and utilities to work with MArgument in type-safe manner.
DynamicType & getManagedExpression(size_type index, ManagedExpressionStore< ManagedExpr > &store) const
Get a reference to an instance of Managed Expression that was sent from Wolfram Language as argument ...
Definition of templated DataStore wrapper called DataList.
typename RequestedTypeImpl< T >::type RequestedType
RequestedType<T> is usually just T and is used as return type of MArgumentManager::get(size_type)
Definition: MArgumentManager.h:319
ManagedExpressionStore will keep track of instances of managed class T and will provide safe access t...
Definition: ManagedExpression.hpp:50
static void set(MArgumentManager &, const T &)
A function that tells LLU how to send an object of a user-defined type as a result of a library funct...
Definition: MArgumentManager.h:751
void setString(const std::string &str)
Set str as output MArgument.
Definition: MArgumentManager.cpp:68
const std::string MLEDynamicTypeError
Invalid dynamic type requested for a Managed Library Expression.
DataStore getDataStore(size_type index) const
Get MArgument of type DataStore at position index.
Definition: MArgumentManager.cpp:117
void set(const GenericSparseArray &t)
Set MSparseArray wrapped by t as output MArgument.
Definition: MArgumentManager.h:537
char * getCString(size_type index) const
Get value of MArgument of type "UTF8String" at position index.
Definition: MArgumentManager.cpp:51
Ownership
An enum listing possible owners of a LibraryLink container.
Definition: Base.hpp:22
Manages arguments exchanged between the paclet C++ code and LibraryLink interface.
Definition: MArgumentManager.h:52
void setDataStore(DataStore ds)
Set DataStore as output MArgument.
Definition: MArgumentManager.cpp:138
Definition of ProgressMonitor class.
MTensor getMTensor(size_type index) const
Get MArgument of type MTensor at position index.
Definition: MArgumentManager.cpp:109
std::tuple< RequestedType< ArgTypes >... > getTuple(std::array< size_type, sizeof...(ArgTypes)> indices) const
Extract arguments from the Manager at given positions and return them as values of given types.
Definition: MArgumentManager.h:354
void setMTensor(MTensor t)
Set MTensor as output MArgument.
Definition: MArgumentManager.cpp:130
void set(mint result) noexcept
Set result as output MArgument.
Definition: MArgumentManager.h:489