22 #include "../config.h"
27 #include "RMonoTypes.h"
28 #include "RMonoHandle_Def.h"
143 static inline const struct RawPtr {} rawPtr = {};
154 FlagMaskType = 0x0007,
155 FlagMaskDirection = 0x0018,
167 FlagDisableAutoUnbox = 0x0100,
173 FlagOwnMemory = 0x0200,
204 copyFromOther(other);
215 template <
typename T,
typename Enable = std::enable_if_t<!std::is_base_of_v<MonoObjectPtrWrapper, T>>>
219 if constexpr(
sizeof(T) <=
sizeof(v.sdata)) {
220 *((T*) v.sdata) = val;
222 v.ddata =
new char[
sizeof(T)];
223 *((T*) v.ddata) = val;
237 template <
typename T>
272 flags |= FlagOwnMemory;
273 if (size <=
sizeof(v.sdata)) {
274 memcpy(v.sdata, data, size);
276 v.ddata =
new char[size];
277 memcpy(v.ddata, data, size);
294 : flags(
TypeMonoObjectPtr | FlagOwnMemory | (autoUnbox ? 0 : FlagDisableAutoUnbox)), o(v) {}
305 : flags(
TypeMonoObjectPtr | FlagOwnMemory | (autoUnbox ? 0 : FlagDisableAutoUnbox)), o(v) {}
319 RMonoVariant(
const MonoObjectPtrWrapper& v,
bool autoUnbox =
true)
320 : flags(
TypeMonoObjectPtr | FlagOwnMemory | (autoUnbox ? 0 : FlagDisableAutoUnbox)), o(v.getWrappedMonoObjectPtr()) {}
354 if (
getType() ==
TypeValue && (flags & FlagOwnMemory) != 0 && !usesStaticValueData()) {
367 if (
this != &other) {
368 copyFromOther(other);
414 void setDirection(
Direction dir) { flags = (flags & ~FlagMaskDirection) | dir; }
421 if ((flags & FlagIsAlias) != 0) {
425 flags &= ~FlagDisableAutoUnbox;
427 flags |= FlagDisableAutoUnbox;
436 return (flags & FlagDisableAutoUnbox) == 0;
456 if ((flags & FlagIsAlias) != 0) {
470 if ((flags & FlagIsAlias) != 0) {
473 return usesStaticValueData() ? v.sdata : v.ddata;
484 if ((flags & FlagIsAlias) != 0) {
487 return usesStaticValueData() ? v.sdata : v.ddata;
495 template <
typename T>
510 if ((flags & FlagIsAlias) != 0) {
513 if ((flags & FlagOwnMemory) != 0) {
528 if ((flags & FlagIsAlias) != 0) {
531 if ((flags & FlagOwnMemory) != 0) {
534 return (pp ? *pp : 0);
546 template <
typename ABI>
556 template <
typename ABI>
566 template <
typename ABI>
571 : flags((other->flags & ~FlagMaskDirection) | FlagIsAlias | dir), alias(other) {}
573 void copyFromOther(
const Self& other)
575 if ((other.flags & FlagIsAlias) != 0) {
578 }
else if (other.getType() == TypeMonoObjectPtr && (other.flags & FlagOwnMemory) != 0) {
581 }
else if (other.getType() == TypeValue && (other.flags & FlagOwnMemory) != 0 && !other.usesStaticValueData()) {
582 v.size = other.v.size;
583 v.ddata =
new char[v.size];
584 memcpy(v.ddata, other.v.ddata, v.size);
587 memcpy(
this, &other,
sizeof(Self));
591 bool usesStaticValueData()
const
593 if ((flags & FlagIsAlias) != 0) {
594 return alias->usesStaticValueData();
596 return ((flags & FlagOwnMemory) != 0) && v.size <=
sizeof(v.sdata);
626 #include "RMonoVariant_Impl.h"
Direction
Definition: RMonoVariant_Def.h:115
RMonoVariant(const Self &other)
Definition: RMonoVariant_Def.h:202
@ DirectionInOut
Definition: RMonoVariant_Def.h:137
RMonoVariant(RMonoObjectPtr *v, bool autoUnbox=true)
Definition: RMonoVariant_Def.h:316
Self inout() const
Definition: RMonoVariant_Def.h:398
Self in() const
Definition: RMonoVariant_Def.h:388
bool isNullPointer() const
Definition: RMonoVariant_Impl.h:37
static constexpr size_t getMaxRequiredAlignment()
Definition: RMonoVariant_Def.h:187
@ TypeMonoObjectPtr
Definition: RMonoVariant_Def.h:89
Definition: RMonoVariant_Def.h:146
Type
Definition: RMonoVariant_Def.h:77
Definition: RMonoAPIBase_Def.h:43
T getValue() const
Definition: RMonoVariant_Def.h:496
RMonoVariant(RMonoObjectPtr &&v, bool autoUnbox=true)
Definition: RMonoVariant_Def.h:304
void copyForRemoteMemory(ABI &abi, void *buf) const
Definition: RMonoVariant_Impl.h:115
@ DirectionDefault
Definition: RMonoVariant_Def.h:122
size_t getValueSize() const
Definition: RMonoVariant_Def.h:453
size_t getRemoteMemorySize(ABI &abi, size_t &alignment) const
Definition: RMonoVariant_Impl.h:61
RMonoVariant(rmono_voidp v, RawPtr)
Definition: RMonoVariant_Def.h:337
bool isAutoUnboxEnabled() const
Definition: RMonoVariant_Def.h:434
void updateFromRemoteMemory(ABI &abi, RMonoAPIBase &mono, void *buf)
Definition: RMonoVariant_Impl.h:143
@ DirectionIn
Definition: RMonoVariant_Def.h:127
RMonoVariant()
Definition: RMonoVariant_Def.h:197
RMonoVariant(void *data, size_t size, bool copy=false)
Definition: RMonoVariant_Def.h:268
Self forDirection(Direction dir) const
Definition: RMonoVariant_Def.h:382
bool isValid() const
Definition: RMonoVariant_Def.h:405
const void * getValueData() const
Definition: RMonoVariant_Def.h:481
@ TypeRawPtr
Definition: RMonoVariant_Def.h:94
void * getValueData()
Definition: RMonoVariant_Def.h:467
Type getType() const
Definition: RMonoVariant_Def.h:411
RMonoObjectPtr getMonoObjectPtr() const
Definition: RMonoVariant_Def.h:507
RMonoVariant(rmono_voidp *v, RawPtr)
Definition: RMonoVariant_Def.h:350
RMonoVariant(T *val)
Definition: RMonoVariant_Def.h:238
RMonoVariant(T val)
Definition: RMonoVariant_Def.h:216
void setAutoUnboxEnabled(bool autoUnbox)
Definition: RMonoVariant_Def.h:419
@ DirectionOut
Definition: RMonoVariant_Def.h:132
@ TypeValue
Definition: RMonoVariant_Def.h:84
Self & operator=(const Self &other)
Definition: RMonoVariant_Def.h:365
Definition: RMonoVariant_Def.h:71
Self out() const
Definition: RMonoVariant_Def.h:393
RMonoVariant(std::nullptr_t)
Definition: RMonoVariant_Def.h:327
RMonoVariant(const RMonoObjectPtr &v, bool autoUnbox=true)
Definition: RMonoVariant_Def.h:293
rmono_voidp getRawPtr() const
Definition: RMonoVariant_Def.h:525