VariantAs.hpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2020
  3. // MIT License
  4. #pragma once
  5. #include <ArduinoJson/Strings/IsWriteableString.hpp>
  6. #include <ArduinoJson/Variant/VariantData.hpp>
  7. namespace ARDUINOJSON_NAMESPACE {
  8. class ArrayRef;
  9. class ArrayConstRef;
  10. class ObjectRef;
  11. class ObjectConstRef;
  12. class VariantRef;
  13. class VariantConstRef;
  14. // A metafunction that returns the type of the value returned by
  15. // VariantRef::as<T>()
  16. template <typename T>
  17. struct VariantAs {
  18. typedef T type;
  19. };
  20. template <>
  21. struct VariantAs<char*> {
  22. typedef const char* type;
  23. };
  24. // A metafunction that returns the type of the value returned by
  25. // VariantRef::as<T>()
  26. template <typename T>
  27. struct VariantConstAs {
  28. typedef typename VariantAs<T>::type type;
  29. };
  30. template <>
  31. struct VariantConstAs<VariantRef> {
  32. typedef VariantConstRef type;
  33. };
  34. template <>
  35. struct VariantConstAs<ObjectRef> {
  36. typedef ObjectConstRef type;
  37. };
  38. template <>
  39. struct VariantConstAs<ArrayRef> {
  40. typedef ArrayConstRef type;
  41. };
  42. // ---
  43. template <typename T>
  44. inline typename enable_if<is_integral<T>::value, T>::type variantAs(
  45. const VariantData* data) {
  46. return data != 0 ? data->asIntegral<T>() : T(0);
  47. }
  48. template <typename T>
  49. inline typename enable_if<is_enum<T>::value, T>::type variantAs(
  50. const VariantData* data) {
  51. return data != 0 ? static_cast<T>(data->asIntegral<int>()) : T();
  52. }
  53. template <typename T>
  54. inline typename enable_if<is_same<T, bool>::value, T>::type variantAs(
  55. const VariantData* data) {
  56. return data != 0 ? data->asBoolean() : false;
  57. }
  58. template <typename T>
  59. inline typename enable_if<is_floating_point<T>::value, T>::type variantAs(
  60. const VariantData* data) {
  61. return data != 0 ? data->asFloat<T>() : T(0);
  62. }
  63. template <typename T>
  64. inline typename enable_if<is_same<T, const char*>::value ||
  65. is_same<T, char*>::value,
  66. const char*>::type
  67. variantAs(const VariantData* data) {
  68. return data != 0 ? data->asString() : 0;
  69. }
  70. template <typename T>
  71. T variantAs(VariantData* data, MemoryPool*) {
  72. // By default use the read-only conversion.
  73. // There are specializations for
  74. // - ArrayRef
  75. return variantAs<T>(data);
  76. }
  77. template <typename T>
  78. inline typename enable_if<is_same<ArrayConstRef, T>::value, T>::type variantAs(
  79. const VariantData* data);
  80. template <typename T>
  81. inline typename enable_if<is_same<ObjectConstRef, T>::value, T>::type variantAs(
  82. const VariantData* data);
  83. template <typename T>
  84. inline typename enable_if<is_same<VariantConstRef, T>::value, T>::type
  85. variantAs(const VariantData* data);
  86. template <typename T>
  87. inline typename enable_if<IsWriteableString<T>::value, T>::type variantAs(
  88. const VariantData* data);
  89. } // namespace ARDUINOJSON_NAMESPACE