BsMonoArray.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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<class T>
  25. T* getRawPtr(UINT32 offset = 0)
  26. {
  27. #if BS_DEBUG_MODE
  28. int nativeSize = sizeof(T);
  29. ::MonoClass* arrayClass = mono_object_get_class((MonoObject*)(mInternal));
  30. ::MonoClass* elementClass = mono_class_get_element_class(arrayClass);
  31. int monoSize = mono_class_array_element_size(elementClass);
  32. assert(nativeSize == monoSize);
  33. #endif
  34. return (T*)mono_array_addr(mInternal, T, offset);
  35. }
  36. template<class T>
  37. static ScriptArray create(UINT32 size)
  38. {
  39. return ScriptArray(*T::getMetaData()->scriptClass, size);
  40. }
  41. template<>
  42. static ScriptArray create<UINT32>(UINT32 size)
  43. {
  44. return ScriptArray(mono_get_uint32_class(), size);
  45. }
  46. template<>
  47. static ScriptArray create<INT32>(UINT32 size)
  48. {
  49. return ScriptArray(mono_get_int32_class(), size);
  50. }
  51. template<>
  52. static ScriptArray create<WString>(UINT32 size)
  53. {
  54. return ScriptArray(mono_get_string_class(), size);
  55. }
  56. template<>
  57. static ScriptArray create<String>(UINT32 size)
  58. {
  59. return ScriptArray(mono_get_string_class(), size);
  60. }
  61. template<>
  62. static ScriptArray create<float>(UINT32 size)
  63. {
  64. return ScriptArray(mono_get_single_class(), size);
  65. }
  66. UINT32 size() const;
  67. MonoArray* getInternal() const { return mInternal; }
  68. private:
  69. MonoArray* mInternal;
  70. };
  71. }