soci-vector-helpers.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //
  2. // Copyright (C) 2021 Sinitsyn Ilya
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. #ifndef SOCI_VECTOR_HELPERS_H_INCLUDED
  8. #define SOCI_VECTOR_HELPERS_H_INCLUDED
  9. #include "soci-exchange-cast.h"
  10. namespace soci
  11. {
  12. namespace details
  13. {
  14. // Helper functions to work with vectors.
  15. template <exchange_type e>
  16. std::vector<typename exchange_type_traits<e>::value_type>& exchange_vector_type_cast(void *data)
  17. {
  18. return *static_cast<std::vector<typename exchange_type_traits<e>::value_type>*>(data);
  19. }
  20. // Get the size of the vector.
  21. inline std::size_t get_vector_size(exchange_type e, void *data)
  22. {
  23. switch (e)
  24. {
  25. case x_char:
  26. return exchange_vector_type_cast<x_char>(data).size();
  27. case x_stdstring:
  28. return exchange_vector_type_cast<x_stdstring>(data).size();
  29. case x_int8:
  30. return exchange_vector_type_cast<x_int8>(data).size();
  31. case x_uint8:
  32. return exchange_vector_type_cast<x_uint8>(data).size();
  33. case x_int16:
  34. return exchange_vector_type_cast<x_int16>(data).size();
  35. case x_uint16:
  36. return exchange_vector_type_cast<x_uint16>(data).size();
  37. case x_int32:
  38. return exchange_vector_type_cast<x_int32>(data).size();
  39. case x_uint32:
  40. return exchange_vector_type_cast<x_uint32>(data).size();
  41. case x_int64:
  42. return exchange_vector_type_cast<x_int64>(data).size();
  43. case x_uint64:
  44. return exchange_vector_type_cast<x_uint64>(data).size();
  45. case x_double:
  46. return exchange_vector_type_cast<x_double>(data).size();
  47. case x_stdtm:
  48. return exchange_vector_type_cast<x_stdtm>(data).size();
  49. case x_xmltype:
  50. return exchange_vector_type_cast<x_xmltype>(data).size();
  51. case x_longstring:
  52. return exchange_vector_type_cast<x_longstring>(data).size();
  53. case x_statement:
  54. case x_rowid:
  55. case x_blob:
  56. break;
  57. }
  58. throw soci_error("Failed to get the size of the vector of non-supported type.");
  59. }
  60. // Set the size of the vector.
  61. inline void resize_vector(exchange_type e, void *data, std::size_t newSize)
  62. {
  63. switch (e)
  64. {
  65. case x_char:
  66. exchange_vector_type_cast<x_char>(data).resize(newSize);
  67. return;
  68. case x_stdstring:
  69. exchange_vector_type_cast<x_stdstring>(data).resize(newSize);
  70. return;
  71. case x_int8:
  72. exchange_vector_type_cast<x_int8>(data).resize(newSize);
  73. return;
  74. case x_uint8:
  75. exchange_vector_type_cast<x_uint8>(data).resize(newSize);
  76. return;
  77. case x_int16:
  78. exchange_vector_type_cast<x_int16>(data).resize(newSize);
  79. return;
  80. case x_uint16:
  81. exchange_vector_type_cast<x_uint16>(data).resize(newSize);
  82. return;
  83. case x_int32:
  84. exchange_vector_type_cast<x_int32>(data).resize(newSize);
  85. return;
  86. case x_uint32:
  87. exchange_vector_type_cast<x_uint32>(data).resize(newSize);
  88. return;
  89. case x_int64:
  90. exchange_vector_type_cast<x_int64>(data).resize(newSize);
  91. return;
  92. case x_uint64:
  93. exchange_vector_type_cast<x_uint64>(data).resize(newSize);
  94. return;
  95. case x_double:
  96. exchange_vector_type_cast<x_double>(data).resize(newSize);
  97. return;
  98. case x_stdtm:
  99. exchange_vector_type_cast<x_stdtm>(data).resize(newSize);
  100. return;
  101. case x_xmltype:
  102. exchange_vector_type_cast<x_xmltype>(data).resize(newSize);
  103. return;
  104. case x_longstring:
  105. exchange_vector_type_cast<x_longstring>(data).resize(newSize);
  106. return;
  107. case x_statement:
  108. case x_rowid:
  109. case x_blob:
  110. break;
  111. }
  112. throw soci_error("Failed to get the size of the vector of non-supported type.");
  113. }
  114. // Get the string at the given index of the vector.
  115. inline std::string& vector_string_value(exchange_type e, void *data, std::size_t ind)
  116. {
  117. switch (e)
  118. {
  119. case x_stdstring:
  120. return exchange_vector_type_cast<x_stdstring>(data).at(ind);
  121. case x_xmltype:
  122. return exchange_vector_type_cast<x_xmltype>(data).at(ind).value;
  123. case x_longstring:
  124. return exchange_vector_type_cast<x_longstring>(data).at(ind).value;
  125. case x_char:
  126. case x_int8:
  127. case x_uint8:
  128. case x_int16:
  129. case x_uint16:
  130. case x_int32:
  131. case x_uint32:
  132. case x_int64:
  133. case x_uint64:
  134. case x_double:
  135. case x_stdtm:
  136. case x_statement:
  137. case x_rowid:
  138. case x_blob:
  139. break;
  140. }
  141. throw soci_error("Can't get the string value from the vector of values with non-supported type.");
  142. }
  143. } // namespace details
  144. } // namespace soci
  145. #endif // SOCI_VECTOR_HELPERS_H_INCLUDED