BsMonoArray.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #pragma once
  2. #include "BsMonoPrerequisites.h"
  3. #include "BsScriptMeta.h"
  4. #include "BsMonoManager.h"
  5. #include <mono/jit/jit.h>
  6. namespace BansheeEngine
  7. {
  8. class BS_MONO_EXPORT ScriptArray
  9. {
  10. public:
  11. ScriptArray(MonoArray* existingArray);
  12. ScriptArray(MonoClass& klass, UINT32 size);
  13. ScriptArray(::MonoClass* klass, UINT32 size);
  14. template<class T>
  15. T get(UINT32 idx)
  16. {
  17. return mono_array_get(mInternal, T, idx);
  18. }
  19. template<class T>
  20. void set(UINT32 idx, const T& value)
  21. {
  22. mono_array_set(mInternal, T, idx, value);
  23. }
  24. template<>
  25. String get(UINT32 idx);
  26. template<>
  27. WString get(UINT32 idx);
  28. template<>
  29. void set<String>(UINT32 idx, const String& value);
  30. template<>
  31. void set<WString>(UINT32 idx, const WString& value);
  32. template<class T>
  33. T* getRawPtr(UINT32 idx = 0)
  34. {
  35. #if BS_DEBUG_MODE
  36. assert(sizeof(T) == elementSize());
  37. #endif
  38. return (T*)mono_array_addr(mInternal, T, idx);
  39. }
  40. UINT8* getRawPtr(UINT32 size, UINT32 idx = 0)
  41. {
  42. #if BS_DEBUG_MODE
  43. assert(size == elementSize());
  44. #endif
  45. return (UINT8*)mono_array_addr_with_size(mInternal, size, idx);
  46. }
  47. template<class T>
  48. static ScriptArray create(UINT32 size)
  49. {
  50. return ScriptArray(*T::getMetaData()->scriptClass, size);
  51. }
  52. template<>
  53. static ScriptArray create<UINT32>(UINT32 size)
  54. {
  55. return ScriptArray(mono_get_uint32_class(), size);
  56. }
  57. template<>
  58. static ScriptArray create<INT32>(UINT32 size)
  59. {
  60. return ScriptArray(mono_get_int32_class(), size);
  61. }
  62. template<>
  63. static ScriptArray create<UINT64>(UINT32 size)
  64. {
  65. return ScriptArray(mono_get_uint64_class(), size);
  66. }
  67. template<>
  68. static ScriptArray create<INT64>(UINT32 size)
  69. {
  70. return ScriptArray(mono_get_int64_class(), size);
  71. }
  72. template<>
  73. static ScriptArray create<WString>(UINT32 size)
  74. {
  75. return ScriptArray(mono_get_string_class(), size);
  76. }
  77. template<>
  78. static ScriptArray create<String>(UINT32 size)
  79. {
  80. return ScriptArray(mono_get_string_class(), size);
  81. }
  82. template<>
  83. static ScriptArray create<float>(UINT32 size)
  84. {
  85. return ScriptArray(mono_get_single_class(), size);
  86. }
  87. template<>
  88. static ScriptArray create<bool>(UINT32 size)
  89. {
  90. return ScriptArray(mono_get_boolean_class(), size);
  91. }
  92. UINT32 size() const;
  93. UINT32 elementSize() const;
  94. MonoArray* getInternal() const { return mInternal; }
  95. private:
  96. MonoArray* mInternal;
  97. };
  98. }