BsScriptSerializableArray.cpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "BsScriptSerializableArray.h"
  2. #include "BsScriptSerializableArrayRTTI.h"
  3. #include "BsMonoManager.h"
  4. #include "BsRuntimeScriptObjects.h"
  5. #include "BsScriptSerializableField.h"
  6. using namespace CamelotFramework;
  7. namespace BansheeEngine
  8. {
  9. ScriptSerializableArray::ScriptSerializableArray(const ConstructPrivately& dummy)
  10. :mManagedInstance(nullptr), mNumElements(0), mClass(nullptr)
  11. {
  12. }
  13. ScriptSerializableArray::ScriptSerializableArray(const ConstructPrivately& dummy, const ScriptSerializableTypeInfoArrayPtr& typeInfo, MonoObject* managedInstance)
  14. :mArrayTypeInfo(typeInfo), mManagedInstance(managedInstance), mNumElements(0)
  15. {
  16. mClass = mono_object_get_class(mManagedInstance);
  17. mNumElements = (UINT32)mono_array_length((MonoArray*)mManagedInstance);
  18. mArrayEntries.resize(mNumElements);
  19. for(UINT32 i = 0; i < mNumElements; i++)
  20. {
  21. mArrayEntries[i] = getFieldData(i);
  22. }
  23. }
  24. ScriptSerializableArrayPtr ScriptSerializableArray::create(MonoObject* managedInstance, const ScriptSerializableTypeInfoArrayPtr& typeInfo)
  25. {
  26. if(!RuntimeScriptObjects::instance().isArray(managedInstance))
  27. return nullptr;
  28. return cm_shared_ptr<ScriptSerializableArray>(ConstructPrivately(), typeInfo, managedInstance);
  29. }
  30. ScriptSerializableArrayPtr ScriptSerializableArray::createEmpty()
  31. {
  32. return cm_shared_ptr<ScriptSerializableArray>(ConstructPrivately());
  33. }
  34. void ScriptSerializableArray::setFieldData(CM::UINT32 arrayIdx, const ScriptSerializableFieldDataPtr& val)
  35. {
  36. setValue(arrayIdx, val->getValue(mArrayTypeInfo->mElementType));
  37. }
  38. ScriptSerializableFieldDataPtr ScriptSerializableArray::getFieldData(CM::UINT32 arrayIdx)
  39. {
  40. return ScriptSerializableFieldData::create(mArrayTypeInfo->mElementType, getValue(arrayIdx));
  41. }
  42. void ScriptSerializableArray::setValue(CM::UINT32 arrayIdx, void* val)
  43. {
  44. if(arrayIdx >= mNumElements)
  45. CM_EXCEPT(InvalidParametersException, "Array index out of range: " + toString(arrayIdx) + ". Valid range is [0, " + toString(mNumElements) + ")");
  46. MonoArray* array = (MonoArray*)mManagedInstance;
  47. UINT32 elemSize = mono_array_element_size(mClass);
  48. UINT32 numElems = (UINT32)mono_array_length(array);
  49. assert(arrayIdx < numElems);
  50. void* elemAddr = mono_array_addr_with_size(array, elemSize, arrayIdx);
  51. memcpy(elemAddr, val, elemSize);
  52. }
  53. void* ScriptSerializableArray::getValue(CM::UINT32 arrayIdx)
  54. {
  55. if(arrayIdx >= mNumElements)
  56. CM_EXCEPT(InvalidParametersException, "Array index out of range: " + toString(arrayIdx) + ". Valid range is [0, " + toString(mNumElements) + ")");
  57. MonoArray* array = (MonoArray*)mManagedInstance;
  58. UINT32 elemSize = mono_array_element_size(mClass);
  59. UINT32 numElems = (UINT32)mono_array_length(array);
  60. assert(arrayIdx < numElems);
  61. return mono_array_addr_with_size(array, elemSize, arrayIdx);
  62. }
  63. RTTITypeBase* ScriptSerializableArray::getRTTIStatic()
  64. {
  65. return ScriptSerializableArrayRTTI::instance();
  66. }
  67. RTTITypeBase* ScriptSerializableArray::getRTTI() const
  68. {
  69. return ScriptSerializableArray::getRTTIStatic();
  70. }
  71. }