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 noexcept -> std::size_t;
99 auto getBuffer()
const noexcept ->
const FCharVector&;
102 auto isEmpty()
const noexcept -> bool;
105 auto begin() noexcept -> iterator;
106 auto end() noexcept -> iterator;
107 auto begin()
const noexcept -> const_iterator;
108 auto end()
const noexcept -> 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);
116 void clear() noexcept;
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;
122 void print (
const FColorPair&)
const noexcept;
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 setAttribute (
FChar&)
const noexcept;
135 void add (UnicodeBoundary&);
141 friend auto operator << ( FVTermBuffer::FCharVector& term_string
142 ,
const FVTermBuffer& buf ) -> FVTermBuffer::FCharVector&
144 if ( ! buf.data.empty() )
145 term_string.assign(buf.data.cbegin(), buf.data.cend());
153 constexpr
void checkCapacity (T&, std::size_t) noexcept;
157 template <
typename Iterator>
158 inline FVTermBuffer::FVTermBuffer (Iterator first, Iterator last)
164 inline auto FVTermBuffer::operator [] (std::size_t index) -> reference
170 inline auto FVTermBuffer::operator [] (
const std::size_t index)
const -> const_reference
176 template <
typename NumT
177 , enable_if_arithmetic_without_char_t<NumT>>
178 inline auto FVTermBuffer::operator << (
const NumT& n) ->
FVTermBuffer&
180 print (
FString(std::to_string(n)));
185 template <
typename CharT
186 , enable_if_CString_t<CharT>>
187 inline auto FVTermBuffer::operator << (
const CharT& s) ->
FVTermBuffer&
194 inline auto FVTermBuffer::operator << (
char c) ->
FVTermBuffer&
196 print (
wchar_t(uChar(c)));
201 inline auto FVTermBuffer::operator << (
wchar_t c) ->
FVTermBuffer&
208 inline auto FVTermBuffer::operator << (
const wchar_t* wide_string) ->
FVTermBuffer&
215 inline auto FVTermBuffer::operator << (
const UniChar& c) ->
FVTermBuffer&
217 print (static_cast<wchar_t>(c));
222 inline auto FVTermBuffer::operator << (
const std::string&
string) ->
FVTermBuffer&
229 inline auto FVTermBuffer::operator << (
const std::wstring& wstring) ->
FVTermBuffer&
245 data.emplace_back(fchar);
250 inline auto FVTermBuffer::operator << (
const FCharVector& vec) ->
FVTermBuffer&
252 std::copy(vec.cbegin(), vec.cend(), std::back_inserter(data));
271 inline auto FVTermBuffer::getClassName()
const ->
FString 272 {
return "FVTermBuffer"; }
275 inline auto FVTermBuffer::getLength()
const noexcept -> std::size_t
276 {
return data.size(); }
279 inline auto FVTermBuffer::getBuffer()
const noexcept ->
const FCharVector&
283 inline auto FVTermBuffer::isEmpty()
const noexcept ->
bool 284 {
return data.empty(); }
287 inline auto FVTermBuffer::begin() noexcept -> iterator
288 {
return data.begin(); }
291 inline auto FVTermBuffer::end() noexcept -> iterator
292 {
return data.end(); }
295 inline auto FVTermBuffer::begin()
const noexcept -> const_iterator
296 {
return data.begin(); }
299 inline auto FVTermBuffer::end()
const noexcept -> const_iterator
300 {
return data.end(); }
303 inline auto FVTermBuffer::front() -> reference
304 {
return data.front(); }
307 inline auto FVTermBuffer::back() -> reference
308 {
return data.back(); }
311 inline auto FVTermBuffer::front()
const -> const_reference
312 {
return data.front(); }
315 inline auto FVTermBuffer::back()
const -> const_reference
316 {
return data.back(); }
319 template <
typename Iterator>
320 inline void FVTermBuffer::assign (Iterator first, Iterator last)
325 checkCapacity (data, std::size_t(last - first));
326 data.assign(first, last);
330 inline void FVTermBuffer::clear() noexcept
336 template <
typename... Args>
337 inline auto FVTermBuffer::printf (
const FString& format, Args&&... args) ->
int 340 str.sprintf (format, std::forward<Args>(args)...);
345 inline auto FVTermBuffer::print() noexcept ->
FVTermBuffer&
350 constexpr
void checkCapacity (T& buffer, std::size_t size) noexcept
352 if ( size <= buffer.capacity() )
355 const auto new_size = [size] () noexcept
357 return std::size_t(std::pow(2, std::ceil(std::log(size) / std::log(2.0))));
360 buffer.reserve(new_size);
365 #endif // FVTERMBUFFER_H Definition: fvtermbuffer.h:56
Definition: class_template.cpp:25
Definition: ftypes.h:1081
Definition: fcolorpair.h:49