You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 line
4.0KB

  1. #pragma once
  2. #include <neo/const_buffer.hpp>
  3. #include <neo/mutable_buffer.hpp>
  4. #include <string>
  5. #include <string_view>
  6. #include <type_traits>
  7. namespace neo {
  8. constexpr mutable_buffer buffer(const mutable_buffer& b) noexcept { return b; }
  9. constexpr mutable_buffer buffer(const mutable_buffer& b, mutable_buffer::size_type s) noexcept {
  10. auto min_size = s > b.size() ? b.size() : s;
  11. return mutable_buffer(b.data(), min_size);
  12. }
  13. constexpr const_buffer buffer(const const_buffer& b) noexcept { return b; }
  14. constexpr const_buffer buffer(const const_buffer& b, const_buffer::size_type s) noexcept {
  15. auto min_size = s > b.size() ? b.size() : s;
  16. return const_buffer(b.data(), min_size);
  17. }
  18. // #############################################################################
  19. /**
  20. * Create a mutable buffer from an opaque pointer to void
  21. */
  22. constexpr mutable_buffer buffer(void* ptr, mutable_buffer::size_type s) noexcept {
  23. return mutable_buffer(static_cast<std::byte*>(ptr), s);
  24. }
  25. /**
  26. * Create an immutable buffer from an opaque pointer to void
  27. */
  28. constexpr const_buffer buffer(const void* ptr, const_buffer::size_type s) noexcept {
  29. return const_buffer(static_cast<const std::byte*>(ptr), s);
  30. }
  31. // #############################################################################
  32. /**
  33. * Create a mutable buffer that refers to the bytes of a trivial object.
  34. */
  35. template <typename Trivial,
  36. typename
  37. = std::enable_if_t<!std::is_const_v<Trivial> && !std::is_same_v<Trivial, mutable_buffer>>>
  38. constexpr mutable_buffer buffer(Trivial& item, std::size_t max_size = sizeof(Trivial)) {
  39. auto min_size = max_size > sizeof(item) ? sizeof(item) : max_size;
  40. return mutable_buffer(byte_pointer(std::addressof(item)), min_size);
  41. }
  42. /**
  43. * Create an immutable buffer that refers to the bytes of a trivial object.
  44. */
  45. template <
  46. typename Trivial,
  47. typename = std::enable_if_t<
  48. std::is_const_v<
  49. Trivial> && !std::is_same_v<Trivial, mutable_buffer> && !std::is_same_v<Trivial, const_buffer>>>
  50. constexpr const_buffer buffer(Trivial& item, std::size_t max_size = sizeof(Trivial)) {
  51. auto min_size = std::min(sizeof(item), max_size);
  52. return const_buffer(byte_pointer(std::addressof(item)), min_size);
  53. }
  54. // #############################################################################
  55. /**
  56. * Create a mutable buffer referring to the characters of a basic_string object
  57. */
  58. template <typename Char, typename Traits, typename Alloc>
  59. constexpr mutable_buffer buffer(std::basic_string<Char, Traits, Alloc>& str, std::size_t max_size) {
  60. auto use_size = max_size > str.size() ? str.size() : max_size;
  61. return buffer(str.data(), use_size);
  62. }
  63. template <typename Char, typename Traits, typename Alloc>
  64. constexpr mutable_buffer buffer(std::basic_string<Char, Traits, Alloc>& str) {
  65. return buffer(str, str.size());
  66. }
  67. /**
  68. * Create an immutable buffer refering to the characters of a basic_string object
  69. */
  70. template <typename Char, typename Traits, typename Alloc>
  71. constexpr const_buffer buffer(const std::basic_string<Char, Traits, Alloc>& str,
  72. std::size_t max_size) {
  73. auto use_size = max_size > str.size() ? str.size() : max_size;
  74. return buffer(str.data(), use_size);
  75. }
  76. template <typename Char, typename Traits, typename Alloc>
  77. constexpr const_buffer buffer(const std::basic_string<Char, Traits, Alloc>& str) {
  78. return buffer(str, str.size());
  79. }
  80. // #############################################################################
  81. /**
  82. * Create an immutable buffer referring to the characters of a basic_string_view
  83. */
  84. template <typename Char, typename Traits>
  85. constexpr const_buffer buffer(std::basic_string_view<Char, Traits> sv, std::size_t max_size) {
  86. auto use_size = max_size > sv.size() ? sv.size() : max_size;
  87. return buffer(sv.data(), use_size);
  88. }
  89. template <typename Char, typename Traits>
  90. constexpr const_buffer buffer(std::basic_string_view<Char, Traits> sv) {
  91. return buffer(sv, sv.size());
  92. }
  93. } // namespace neo