Guest User

C_string_value

a guest
Oct 17th, 2026
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #pragma once
  2. #include <cppm/text/C_string_view.hpp>
  3. #include <cppm/text/Lightweight_pascal_string.hpp>
  4. #include <cppm/syntactic_sugar/$unreachable.hpp>
  5. #include <cppm/syntactic_sugar/const_.hpp>
  6.  
  7. #include <memory>
  8. #include <utility>
  9. #include <variant>
  10.  
  11. #include <cstring>
  12.  
  13. namespace cppm {
  14.     using   std::shared_ptr, std::make_shared,  // <memory>
  15.             std::move,                          // <utility>
  16.             std::get, std::variant;             // <variant>
  17.  
  18.     using   std::strcpy;                        // <cstring>
  19.  
  20.     class C_string_value
  21.     {
  22.         using Shared_static     = C_string_view;
  23.         using Shared_dynamic    = shared_ptr<char[]>;       // Data, first bytes represent size.
  24.  
  25.         using Ps = Lightweight_pascal_string;               // For `Shared_dynamic`.
  26.  
  27.         enum{ var_static, var_dynamic };
  28.         using Variant = variant<Shared_static, Shared_dynamic>;
  29.  
  30.         Variant m_value;
  31.  
  32.         auto get_static() const -> const Shared_static& { return get<var_static>( m_value ); }
  33.  
  34.         auto get_dynamic() const -> const Shared_dynamic& { return get<var_dynamic>( m_value ); }
  35.         auto get_dynamic_storage() const -> char* { return get_dynamic().get(); }
  36.         auto get_dynamic_ps() const -> Ps { return Ps( get_dynamic_storage() ); }
  37.  
  38.     protected:
  39.         auto kind() const -> int { return int( m_value.index() ); }         // For testing & debugging.
  40.  
  41.     public:
  42.         template< Nat n_bytes >
  43.         C_string_value( in_<const char[n_bytes]> s ):
  44.             m_value( Shared_static( s ) )
  45.         {
  46.             assert( s[n_bytes - 1] == '\0' );
  47.         }
  48.  
  49.         C_string_value( in_<C_string_view> s ):
  50.             m_value( make_shared<char[]>( Ps::size_for( s ) ) )
  51.         {
  52.             const_<char*> p_storage = get_dynamic_storage();
  53.             Ps::create_in( p_storage, s );
  54.         }
  55.  
  56.         auto c_str() const
  57.             -> C_str
  58.         {
  59.             switch( m_value.index() ) {
  60.                 case +var_static:       { return get_static().c_str(); }
  61.                 case +var_dynamic:      { return get_dynamic_ps().c_str(); }
  62.             }
  63.             $unreachable();
  64.         }
  65.  
  66.         auto sv() const
  67.             -> C_string_view
  68.         {
  69.             switch( m_value.index() ) {
  70.                 case +var_static:       { return get_static(); };
  71.                 case +var_dynamic:      { return get_dynamic_ps().sv(); }
  72.             }
  73.             $unreachable();
  74.         }
  75.  
  76.         auto std_sv() const -> string_view { return sv(); }
  77.     };
  78. }  // cppm
  79.  
Advertisement
Add Comment
Please, Sign In to add comment