31 #ifndef FVTERMBUFFER_H    32 #define FVTERMBUFFER_H    34 #if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT)    35   #error "Only <final/final.h> can be included directly."    43 #include "final/util/fstringstream.h"    60     using FCharVector     = std::vector<FChar>;
    61     using iterator        = FCharVector::iterator;
    62     using const_iterator  = FCharVector::const_iterator;
    63     using reference       = FCharVector::reference;
    64     using const_reference = FCharVector::const_reference;
    65     using difference_type = FCharVector::difference_type;
    70     template <
typename Iterator>
    74     auto operator [] (std::size_t) -> reference;
    75     auto operator [] (
const std::size_t) 
const -> const_reference;
    77     template <
typename NumT
    78             , enable_if_arithmetic_without_char_t<NumT> = 
nullptr>
    81     template <
typename CharT
    82             , enable_if_CString_t<CharT> = 
nullptr>
    97     auto getClassName() 
const -> 
FString;
    98     auto getLength() 
const -> std::size_t;
    99     auto getBuffer() 
const -> 
const FCharVector&;
   102     auto isEmpty() 
const -> bool;
   105     auto begin() -> iterator;
   106     auto end() -> iterator;
   107     auto begin() 
const -> const_iterator;
   108     auto end() 
const -> const_iterator;
   109     auto front() -> reference;
   110     auto back() -> reference;
   111     auto front() 
const -> const_reference;
   112     auto back() 
const -> const_reference;
   113     auto toString() 
const -> 
FString;
   114     template <
typename Iterator>
   115     void assign (Iterator, Iterator);
   117     template <
typename... Args>
   118     auto printf (
const FString&, Args&&...) -> int;
   119     auto print (
const FString&) -> int;
   120     auto print (
wchar_t) -> int;
   121     void print (
const FStyle&) 
const;
   126     struct UnicodeBoundary
   128       FString::const_iterator cbegin{};
   129       FString::const_iterator cend{};
   130       FString::const_iterator iter{};
   131       std::size_t char_width{0};
   134     void getNextCharacterAttribute();
   135     void add (UnicodeBoundary&);
   142     friend auto operator << ( FVTermBuffer::FCharVector& term_string
   143                             , 
const FVTermBuffer& buf ) -> FVTermBuffer::FCharVector&
   145       if ( ! buf.data.empty() )
   146         term_string.assign(buf.data.cbegin(), buf.data.cend());
   154 constexpr 
void checkCapacity (T&, std::size_t) noexcept;
   158 template <
typename Iterator>
   159 inline FVTermBuffer::FVTermBuffer (Iterator first, Iterator last)
   165 inline auto FVTermBuffer::operator [] (std::size_t index) -> reference
   171 inline auto FVTermBuffer::operator [] (
const std::size_t index) 
const -> const_reference
   177 template <
typename NumT
   178         , enable_if_arithmetic_without_char_t<NumT>>
   179 inline auto FVTermBuffer::operator << (
const NumT& n) -> 
FVTermBuffer&
   181   print (
FString(std::to_string(n)));
   186 template <
typename CharT
   187         , enable_if_CString_t<CharT>>
   188 inline auto FVTermBuffer::operator << (
const CharT& s) -> 
FVTermBuffer&
   195 inline auto FVTermBuffer::operator << (
char c) -> 
FVTermBuffer&
   197   print (
wchar_t(uChar(c)));
   202 inline auto FVTermBuffer::operator << (
wchar_t c) -> 
FVTermBuffer&
   209 inline auto FVTermBuffer::operator << (
const wchar_t* wide_string) -> 
FVTermBuffer&
   216 inline auto FVTermBuffer::operator << (
const UniChar& c) -> 
FVTermBuffer&
   218   print (static_cast<wchar_t>(c));
   223 inline auto FVTermBuffer::operator << (
const std::string& 
string) -> 
FVTermBuffer&
   230 inline auto FVTermBuffer::operator << (
const std::wstring& wstring) -> 
FVTermBuffer&
   246   data.emplace_back(fchar);
   251 inline auto FVTermBuffer::operator << (
const FCharVector& vec) -> 
FVTermBuffer&
   253   std::copy(vec.cbegin(), vec.cend(), std::back_inserter(data));
   272 inline auto FVTermBuffer::getClassName() 
const -> 
FString   273 { 
return "FVTermBuffer"; }
   276 inline auto FVTermBuffer::getLength() 
const -> std::size_t
   277 { 
return data.size(); }
   280 inline auto FVTermBuffer::getBuffer() 
const -> 
const FCharVector&
   284 inline auto FVTermBuffer::isEmpty() 
const -> 
bool   285 { 
return data.empty(); }
   288 inline auto FVTermBuffer::begin() -> iterator
   289 { 
return data.begin(); }
   292 inline auto FVTermBuffer::end() -> iterator
   293 { 
return data.end(); }
   296 inline auto FVTermBuffer::begin() 
const -> const_iterator
   297 { 
return data.begin(); }
   300 inline auto FVTermBuffer::end() 
const -> const_iterator
   301 { 
return data.end(); }
   304 inline auto FVTermBuffer::front() -> reference
   305 { 
return data.front(); }
   308 inline auto FVTermBuffer::back() -> reference
   309 { 
return data.back(); }
   312 inline auto FVTermBuffer::front() 
const -> const_reference
   313 { 
return data.front(); }
   316 inline auto FVTermBuffer::back() 
const -> const_reference
   317 { 
return data.back(); }
   320 template <
typename Iterator>
   321 inline void FVTermBuffer::assign (Iterator first, Iterator last)
   326   checkCapacity (data, std::size_t(last - first));
   327   data.assign(first, last);
   331 inline void FVTermBuffer::clear()
   337 template <
typename... Args>
   338 inline auto FVTermBuffer::printf (
const FString& format, Args&&... args) -> 
int   341   str.sprintf (format, std::forward<Args>(args)...);
   351 constexpr 
void checkCapacity (T& buffer, std::size_t size) noexcept
   353   if ( size <= buffer.capacity() )
   356   const auto new_size = [&size] ()
   358     return std::size_t(std::pow(2, std::ceil(std::log(size) / std::log(2.0))));
   361   buffer.reserve(new_size);
   366 #endif  // FVTERMBUFFER_H Definition: fvtermbuffer.h:56
 
Definition: class_template.cpp:25
 
Definition: fcolorpair.h:49