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