DataVariable.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "../../Include/RmlUi/Core/DataVariable.h"
  2. namespace Rml {
  3. bool DataVariable::Get(Variant& variant) const
  4. {
  5. return definition->Get(ptr, variant);
  6. }
  7. bool DataVariable::Set(const Variant& variant)
  8. {
  9. return definition->Set(ptr, variant);
  10. }
  11. int DataVariable::Size() const
  12. {
  13. return definition->Size(ptr);
  14. }
  15. DataVariable DataVariable::Child(const DataAddressEntry& address) const
  16. {
  17. return definition->Child(ptr, address);
  18. }
  19. DataVariableType DataVariable::Type() const
  20. {
  21. return definition->Type();
  22. }
  23. bool VariableDefinition::Get(void* /*ptr*/, Variant& /*variant*/)
  24. {
  25. Log::Message(Log::LT_WARNING, "Values can only be retrieved from scalar data types.");
  26. return false;
  27. }
  28. bool VariableDefinition::Set(void* /*ptr*/, const Variant& /*variant*/)
  29. {
  30. Log::Message(Log::LT_WARNING, "Values can only be assigned to scalar data types.");
  31. return false;
  32. }
  33. int VariableDefinition::Size(void* /*ptr*/)
  34. {
  35. Log::Message(Log::LT_WARNING, "Tried to get the size from a non-array data type.");
  36. return 0;
  37. }
  38. DataVariable VariableDefinition::Child(void* /*ptr*/, const DataAddressEntry& /*address*/)
  39. {
  40. Log::Message(Log::LT_WARNING, "Tried to get the child of a scalar type.");
  41. return DataVariable();
  42. }
  43. StringList VariableDefinition::ReflectMemberNames()
  44. {
  45. Log::Message(Log::LT_WARNING, "Tried to get the member names of a non-struct type.");
  46. return StringList();
  47. }
  48. class LiteralIntDefinition final : public VariableDefinition {
  49. public:
  50. LiteralIntDefinition() : VariableDefinition(DataVariableType::Scalar) {}
  51. bool Get(void* ptr, Variant& variant) override
  52. {
  53. variant = static_cast<int>(reinterpret_cast<intptr_t>(ptr));
  54. return true;
  55. }
  56. };
  57. DataVariable MakeLiteralIntVariable(int value)
  58. {
  59. static LiteralIntDefinition literal_int_definition;
  60. return DataVariable(&literal_int_definition, reinterpret_cast<void*>(static_cast<intptr_t>(value)));
  61. }
  62. StructDefinition::StructDefinition() : VariableDefinition(DataVariableType::Struct) {}
  63. DataVariable StructDefinition::Child(void* ptr, const DataAddressEntry& address)
  64. {
  65. const String& name = address.name;
  66. if (name.empty())
  67. {
  68. Log::Message(Log::LT_WARNING, "Expected a struct member name but none given.");
  69. return DataVariable();
  70. }
  71. auto it = members.find(name);
  72. if (it == members.end())
  73. {
  74. Log::Message(Log::LT_WARNING, "Member %s not found in data struct.", name.c_str());
  75. return DataVariable();
  76. }
  77. VariableDefinition* next_definition = it->second.get();
  78. return DataVariable(next_definition, ptr);
  79. }
  80. StringList StructDefinition::ReflectMemberNames()
  81. {
  82. StringList names;
  83. names.reserve(members.size());
  84. for (const auto& entry : members)
  85. names.push_back(entry.first);
  86. return names;
  87. }
  88. void StructDefinition::AddMember(const String& name, UniquePtr<VariableDefinition> member)
  89. {
  90. RMLUI_ASSERT(member);
  91. bool inserted = members.emplace(name, std::move(member)).second;
  92. RMLUI_ASSERTMSG(inserted, "Member name already exists.");
  93. (void)inserted;
  94. }
  95. FuncDefinition::FuncDefinition(DataGetFunc get, DataSetFunc set) :
  96. VariableDefinition(DataVariableType::Scalar), get(std::move(get)), set(std::move(set))
  97. {}
  98. bool FuncDefinition::Get(void* /*ptr*/, Variant& variant)
  99. {
  100. if (!get)
  101. return false;
  102. get(variant);
  103. return true;
  104. }
  105. bool FuncDefinition::Set(void* /*ptr*/, const Variant& variant)
  106. {
  107. if (!set)
  108. return false;
  109. set(variant);
  110. return true;
  111. }
  112. BasePointerDefinition::BasePointerDefinition(VariableDefinition* underlying_definition) :
  113. VariableDefinition(underlying_definition->Type()), underlying_definition(underlying_definition)
  114. {}
  115. bool BasePointerDefinition::Get(void* ptr, Variant& variant)
  116. {
  117. if (!ptr)
  118. return false;
  119. return underlying_definition->Get(DereferencePointer(ptr), variant);
  120. }
  121. bool BasePointerDefinition::Set(void* ptr, const Variant& variant)
  122. {
  123. if (!ptr)
  124. return false;
  125. return underlying_definition->Set(DereferencePointer(ptr), variant);
  126. }
  127. int BasePointerDefinition::Size(void* ptr)
  128. {
  129. if (!ptr)
  130. return 0;
  131. return underlying_definition->Size(DereferencePointer(ptr));
  132. }
  133. DataVariable BasePointerDefinition::Child(void* ptr, const DataAddressEntry& address)
  134. {
  135. if (!ptr)
  136. return DataVariable();
  137. return underlying_definition->Child(DereferencePointer(ptr), address);
  138. }
  139. } // namespace Rml