8#ifndef INCLUDED_BSLFMT_PADUTIL
9#define INCLUDED_BSLFMT_PADUTIL
122#include <bslscm_version.h>
150template <
class t_CHAR>
162 template <
class t_ITERATOR>
163 struct IteratorTypeIsOK {
164 typedef typename bsl::iterator_traits<t_ITERATOR>::value_type
166 static const bool value =
171 struct CharConverter {
173 template <
class t_INPUT_CHAR>
174 t_CHAR operator()(t_INPUT_CHAR c)
const
176 return static_cast<t_CHAR
>(c);
182#ifdef BSLS_ASSERT_IS_USED
185 static bool fillerIsOK(t_CHAR filler);
187 template <
class t_INPUT_CHAR>
188 static bool fillerIsOK(t_INPUT_CHAR filler);
189 template <
class t_INPUT_CHAR>
195 template <
class t_ITERATOR,
class t_INPUT_CHAR>
196 static t_ITERATOR writeFiller(
199 template <
class t_ITERATOR,
class t_INPUT_CHAR>
200 static t_ITERATOR writeFiller(
202 const t_INPUT_CHAR& filler);
206 template <
class t_ITERATOR,
class t_FILLER>
207 static t_ITERATOR padImpl(
209 std::ptrdiff_t width,
210 const t_FILLER& filler);
227 std::ptrdiff_t *leftPadding,
228 std::ptrdiff_t *rightPadding,
230 std::ptrdiff_t contentWidth,
244 template <
class t_ITERATOR>
245 static t_ITERATOR
pad(t_ITERATOR out,
246 std::ptrdiff_t padWidth,
248 template <
class t_ITERATOR>
249 static t_ITERATOR
pad(t_ITERATOR out,
250 std::ptrdiff_t padWidth,
252 template <
class t_ITERATOR>
253 static t_ITERATOR
pad(t_ITERATOR out,
254 std::ptrdiff_t padWidth,
256 template <
class t_ITERATOR>
257 static t_ITERATOR
pad(t_ITERATOR out,
258 std::ptrdiff_t padWidth,
268#ifdef BSLS_ASSERT_IS_USED
269template <
class t_CHAR>
271bool PadUtil<t_CHAR>::fillerIsOK(t_CHAR)
276template <
class t_CHAR>
283template <
class t_CHAR>
284template <
class t_INPUT_CHAR>
286bool PadUtil<t_CHAR>::fillerIsOK(t_INPUT_CHAR filler)
288 return 0 == (~0x7f & filler);
291template <
class t_CHAR>
292template <
class t_INPUT_CHAR>
294bool PadUtil<t_CHAR>::fillerIsOK(
298 for (Iter it = filler.
begin(); it != filler.
end(); ++it) {
299 if (!fillerIsOK(*it)) {
308template <
class t_CHAR>
309template <
class t_ITERATOR,
class t_INPUT_CHAR>
311t_ITERATOR PadUtil<t_CHAR>::writeFiller(
315 return bsl::transform(filler.
begin(), filler.
end(), out, CharConverter());
318template <
class t_CHAR>
319template <
class t_ITERATOR,
class t_INPUT_CHAR>
321t_ITERATOR PadUtil<t_CHAR>::writeFiller(
323 const t_INPUT_CHAR& filler)
328 *out++ = CharConverter()(filler);
333template <
class t_CHAR>
334template <
class t_ITERATOR,
class t_FILLER>
336t_ITERATOR PadUtil<t_CHAR>::padImpl(t_ITERATOR out,
337 std::ptrdiff_t width,
338 const t_FILLER& filler)
343 while (0 < width--) {
344 out = writeFiller(out, filler);
351template <
class t_CHAR>
353 std::ptrdiff_t *rightPadding,
355 std::ptrdiff_t contentWidth,
360 BSLS_ASSERT(Enums::e_ALIGN_DEFAULT != defaultAlign);
362 if (NumericValue::e_VALUE != widthValue.
category()) {
367 const std::ptrdiff_t width = widthValue.
value();
369 if (width <= contentWidth) {
374 const std::ptrdiff_t totalPadding = width - contentWidth;
376 if (Enums::e_ALIGN_DEFAULT == alignment) {
377 alignment = defaultAlign;
381 case Enums::e_ALIGN_LEFT: {
383 *rightPadding = totalPadding;
385 case Enums::e_ALIGN_RIGHT: {
386 *leftPadding = totalPadding;
389 case Enums::e_ALIGN_MIDDLE: {
390 *leftPadding = totalPadding / 2;
391 *rightPadding = totalPadding - *leftPadding;
399template <
class t_CHAR>
400template <
class t_ITERATOR>
402 std::ptrdiff_t padWidth,
405 return padImpl(out, padWidth, filler);
408template <
class t_CHAR>
409template <
class t_ITERATOR>
411 std::ptrdiff_t padWidth,
414 return padImpl(out, padWidth, filler);
417template <
class t_CHAR>
418template <
class t_ITERATOR>
421 std::ptrdiff_t padWidth,
424 return padImpl(out, padWidth, filler);
427template <
class t_CHAR>
428template <
class t_ITERATOR>
431 std::ptrdiff_t padWidth,
434 return padImpl(out, padWidth, filler);
Definition bslstl_stringview.h:471
BSLS_KEYWORD_CONSTEXPR const_iterator end() const BSLS_KEYWORD_NOEXCEPT
Return the past-the-end iterator for this view.
Definition bslstl_stringview.h:1848
const value_type * const_iterator
Definition bslstl_stringview.h:481
BSLS_KEYWORD_CONSTEXPR const_iterator begin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1830
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_INVOKE_NORETURN(X)
Definition bsls_assert.h:2101
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bslfmt_enablestreamedformatter.h:130
Definition bslmf_issame.h:146
Definition bslfmt_padutil.h:151
static void computePadding(std::ptrdiff_t *leftPadding, std::ptrdiff_t *rightPadding, const NumericValue &widthValue, std::ptrdiff_t contentWidth, Alignment alignment, Alignment defaultAlign=Enums::e_ALIGN_LEFT)
Definition bslfmt_padutil.h:352
Enums::Alignment Alignment
Definition bslfmt_padutil.h:158
static t_ITERATOR pad(t_ITERATOR out, std::ptrdiff_t padWidth, const bsl::string_view &filler)
Definition bslfmt_padutil.h:401
FormatterSpecificationNumericValue NumericValue
Definition bslfmt_padutil.h:156
BSLMF_ASSERT((bsl::is_same< t_CHAR, char >::value||bsl::is_same< t_CHAR, wchar_t >::value))
FormatSpecificationParserEnums Enums
Definition bslfmt_padutil.h:157