BsMonoArray.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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 offset = 0)
  34. {
  35. #if BS_DEBUG_MODE
  36. int nativeSize = sizeof(T);
  37. ::MonoClass* arrayClass = mono_object_get_class((MonoObject*)(mInternal));
  38. ::MonoClass* elementClass = mono_class_get_element_class(arrayClass);
  39. int monoSize = mono_class_array_element_size(elementClass);
  40. assert(nativeSize == monoSize);
  41. #endif
  42. return (T*)mono_array_addr(mInternal, T, offset);
  43. }
  44. template<class T>
  45. static ScriptArray create(UINT32 size)
  46. {
  47. return ScriptArray(*T::getMetaData()->scriptClass, size);
  48. }
  49. template<>
  50. static ScriptArray create<UINT32>(UINT32 size)
  51. {
  52. return ScriptArray(mono_get_uint32_class(), size);
  53. }
  54. template<>
  55. static ScriptArray create<INT32>(UINT32 size)
  56. {
  57. return ScriptArray(mono_get_int32_class(), size);
  58. }
  59. template<>
  60. static ScriptArray create<UINT64>(UINT32 size)
  61. {
  62. return ScriptArray(mono_get_uint64_class(), size);
  63. }
  64. template<>
  65. static ScriptArray create<INT64>(UINT32 size)
  66. {
  67. return ScriptArray(mono_get_int64_class(), size);
  68. }
  69. template<>
  70. static ScriptArray create<WString>(UINT32 size)
  71. {
  72. return ScriptArray(mono_get_string_class(), size);
  73. }
  74. template<>
  75. static ScriptArray create<String>(UINT32 size)
  76. {
  77. return ScriptArray(mono_get_string_class(), size);
  78. }
  79. template<>
  80. static ScriptArray create<float>(UINT32 size)
  81. {
  82. return ScriptArray(mono_get_single_class(), size);
  83. }
  84. UINT32 size() const;
  85. MonoArray* getInternal() const { return mInternal; }
  86. private:
  87. MonoArray* mInternal;
  88. };
  89. }