summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2023-03-26 01:32:50 +1100
committer Vas Crabb <vas@vastheman.com>2023-03-26 01:32:50 +1100
commit4cf33cfe0a427d24d754c134eb94b9d1a67da637 (patch)
tree71d0864fd5efa77a50ed2061d3a2c6da05c41b33 /src/lib
parentfb81cb16bb19603f7fa0fff3698bdfa32b2896fc (diff)
Various optimisations to code generaton.
util/bitmap.cpp, util/palette.cpp: Marked lots of things constexpr. Bitmaps don't throw exceptions on allocation failure, they just become invalid. Almost nothing in MAME actually checks for this. emu/profiler.cpp: Abort if the profile stack overflows rather than throwing an exception. This is a developer feature and if it overflows, the code is broken. Calling a noreturn noexcept function generates less code than throwing an exception, which adds up. util/strformat.cpp: Traded away some unnecessary flexibility for more compact code. The stream objects must derive from std::basic_ostream now - they can't just be any old objects with the expected operators.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/util/bitmap.cpp30
-rw-r--r--src/lib/util/bitmap.h198
-rw-r--r--src/lib/util/corefile.cpp8
-rw-r--r--src/lib/util/corefile.h2
-rw-r--r--src/lib/util/palette.cpp40
-rw-r--r--src/lib/util/palette.h56
-rw-r--r--src/lib/util/strformat.cpp747
-rw-r--r--src/lib/util/strformat.h941
8 files changed, 498 insertions, 1524 deletions
diff --git a/src/lib/util/bitmap.cpp b/src/lib/util/bitmap.cpp
index 76eb764e129..8287009311d 100644
--- a/src/lib/util/bitmap.cpp
+++ b/src/lib/util/bitmap.cpp
@@ -23,7 +23,7 @@
// compute_rowpixels - compute a rowpixels value
//-------------------------------------------------
-inline int32_t bitmap_t::compute_rowpixels(int width, int xslop)
+inline int32_t bitmap_t::compute_rowpixels(int width, int xslop) noexcept
{
return width + 2 * xslop;
}
@@ -34,7 +34,7 @@ inline int32_t bitmap_t::compute_rowpixels(int width, int xslop)
// with the given slop values
//-------------------------------------------------
-inline void bitmap_t::compute_base(int xslop, int yslop)
+inline void bitmap_t::compute_base(int xslop, int yslop) noexcept
{
m_base = &m_alloc[(m_rowpixels * yslop + xslop) * (m_bpp / 8)];
}
@@ -45,7 +45,7 @@ inline void bitmap_t::compute_base(int xslop, int yslop)
// is valid and agrees with the BPP
//-------------------------------------------------
-inline bool bitmap_t::valid_format() const
+inline bool bitmap_t::valid_format() const noexcept
{
switch (m_format)
{
@@ -81,7 +81,7 @@ inline bool bitmap_t::valid_format() const
// BITMAP ALLOCATION/CONFIGURATION
//**************************************************************************
-bitmap_t::bitmap_t(bitmap_t &&that)
+bitmap_t::bitmap_t(bitmap_t &&that) noexcept
: m_alloc(std::move(that.m_alloc))
, m_allocbytes(that.m_allocbytes)
, m_base(that.m_base)
@@ -112,7 +112,7 @@ bitmap_t::bitmap_t(bitmap_t &&that)
* @param yslop The yslop.
*/
-bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, int width, int height, int xslop, int yslop)
+bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, int width, int height, int xslop, int yslop) noexcept
: m_alloc()
, m_allocbytes(0)
, m_format(format)
@@ -138,7 +138,7 @@ bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, int width, int height, int
* @param rowpixels The rowpixels.
*/
-bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, void *base, int width, int height, int rowpixels)
+bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, void *base, int width, int height, int rowpixels) noexcept
: m_alloc()
, m_allocbytes(0)
, m_base(base)
@@ -164,7 +164,7 @@ bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, void *base, int width, int
* @param subrect The subrect.
*/
-bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, bitmap_t &source, const rectangle &subrect)
+bitmap_t::bitmap_t(bitmap_format format, uint8_t bpp, bitmap_t &source, const rectangle &subrect) noexcept
: m_alloc()
, m_allocbytes(0)
, m_base(source.raw_pixptr(subrect.top(), subrect.left()))
@@ -195,7 +195,7 @@ bitmap_t::~bitmap_t()
reset();
}
-bitmap_t &bitmap_t::operator=(bitmap_t &&that)
+bitmap_t &bitmap_t::operator=(bitmap_t &&that) noexcept
{
m_alloc = std::move(that.m_alloc);
m_allocbytes = that.m_allocbytes;
@@ -225,7 +225,7 @@ bitmap_t &bitmap_t::operator=(bitmap_t &&that)
* @param yslop The yslop.
*/
-void bitmap_t::allocate(int width, int height, int xslop, int yslop)
+void bitmap_t::allocate(int width, int height, int xslop, int yslop) noexcept
{
assert(m_format != BITMAP_FORMAT_INVALID);
assert(m_bpp == 8 || m_bpp == 16 || m_bpp == 32 || m_bpp == 64);
@@ -272,7 +272,7 @@ void bitmap_t::allocate(int width, int height, int xslop, int yslop)
* @param yslop The yslop.
*/
-void bitmap_t::resize(int width, int height, int xslop, int yslop)
+void bitmap_t::resize(int width, int height, int xslop, int yslop) noexcept
{
assert(m_format != BITMAP_FORMAT_INVALID);
assert(m_bpp == 8 || m_bpp == 16 || m_bpp == 32 || m_bpp == 64);
@@ -317,7 +317,7 @@ void bitmap_t::resize(int width, int height, int xslop, int yslop)
* -------------------------------------------------.
*/
-void bitmap_t::reset()
+void bitmap_t::reset() noexcept
{
// delete any existing stuff
set_palette(nullptr);
@@ -345,7 +345,7 @@ void bitmap_t::reset()
* @param rowpixels The rowpixels.
*/
-void bitmap_t::wrap(void *base, int width, int height, int rowpixels)
+void bitmap_t::wrap(void *base, int width, int height, int rowpixels) noexcept
{
assert(base || (!width && !height));
assert(!m_alloc || (&m_alloc[0] > base) || (&m_alloc[m_allocbytes] <= base));
@@ -373,7 +373,7 @@ void bitmap_t::wrap(void *base, int width, int height, int rowpixels)
* @param subrect The subrect.
*/
-void bitmap_t::wrap(bitmap_t &source, const rectangle &subrect)
+void bitmap_t::wrap(bitmap_t &source, const rectangle &subrect) noexcept
{
assert(&source != this);
assert(m_format == source.m_format);
@@ -402,7 +402,7 @@ void bitmap_t::wrap(bitmap_t &source, const rectangle &subrect)
* @param [in,out] palette If non-null, the palette.
*/
-void bitmap_t::set_palette(palette_t *palette)
+void bitmap_t::set_palette(palette_t *palette) noexcept
{
// first reference the new palette
if (palette)
@@ -426,7 +426,7 @@ void bitmap_t::set_palette(palette_t *palette)
* @param bounds The bounds.
*/
-void bitmap_t::fill(uint64_t color, const rectangle &bounds)
+void bitmap_t::fill(uint64_t color, const rectangle &bounds) noexcept
{
// if we have a cliprect, intersect with that
rectangle fill(bounds);
diff --git a/src/lib/util/bitmap.h b/src/lib/util/bitmap.h
index 6fe08c0b7d6..56c4328d5ed 100644
--- a/src/lib/util/bitmap.h
+++ b/src/lib/util/bitmap.h
@@ -136,60 +136,60 @@ class bitmap_t
protected:
// construction/destruction -- subclasses only to ensure type correctness
bitmap_t(const bitmap_t &) = delete;
- bitmap_t(bitmap_t &&that);
- bitmap_t(bitmap_format format, uint8_t bpp, int width = 0, int height = 0, int xslop = 0, int yslop = 0);
- bitmap_t(bitmap_format format, uint8_t bpp, void *base, int width, int height, int rowpixels);
- bitmap_t(bitmap_format format, uint8_t bpp, bitmap_t &source, const rectangle &subrect);
+ bitmap_t(bitmap_t &&that) noexcept;
+ bitmap_t(bitmap_format format, uint8_t bpp, int width = 0, int height = 0, int xslop = 0, int yslop = 0) noexcept;
+ bitmap_t(bitmap_format format, uint8_t bpp, void *base, int width, int height, int rowpixels) noexcept;
+ bitmap_t(bitmap_format format, uint8_t bpp, bitmap_t &source, const rectangle &subrect) noexcept;
virtual ~bitmap_t();
// prevent implicit copying
bitmap_t &operator=(const bitmap_t &) = delete;
- bitmap_t &operator=(bitmap_t &&that);
+ bitmap_t &operator=(bitmap_t &&that) noexcept;
public:
// allocation/deallocation
- void reset();
+ void reset() noexcept;
// getters
- int32_t width() const { return m_width; }
- int32_t height() const { return m_height; }
- int32_t rowpixels() const { return m_rowpixels; }
- int32_t rowbytes() const { return m_rowpixels * m_bpp / 8; }
- uint8_t bpp() const { return m_bpp; }
- bitmap_format format() const { return m_format; }
- bool valid() const { return (m_base != nullptr); }
- palette_t *palette() const { return m_palette; }
- const rectangle &cliprect() const { return m_cliprect; }
-
- // allocation/sizing
- void allocate(int width, int height, int xslop = 0, int yslop = 0);
- void resize(int width, int height, int xslop = 0, int yslop = 0);
+ int32_t width() const noexcept { return m_width; }
+ int32_t height() const noexcept { return m_height; }
+ int32_t rowpixels() const noexcept { return m_rowpixels; }
+ int32_t rowbytes() const noexcept { return m_rowpixels * m_bpp / 8; }
+ uint8_t bpp() const noexcept { return m_bpp; }
+ bitmap_format format() const noexcept { return m_format; }
+ bool valid() const noexcept { return (m_base != nullptr); }
+ palette_t *palette() const noexcept { return m_palette; }
+ const rectangle &cliprect() const noexcept { return m_cliprect; }
+
+ // allocation/sizing (bitmap will become invalid if allocation fails)
+ void allocate(int width, int height, int xslop = 0, int yslop = 0) noexcept;
+ void resize(int width, int height, int xslop = 0, int yslop = 0) noexcept;
// operations
- void set_palette(palette_t *palette);
- void fill(uint64_t color) { fill(color, m_cliprect); }
- void fill(uint64_t color, const rectangle &bounds);
- void plot_box(int32_t x, int32_t y, int32_t width, int32_t height, uint64_t color)
+ void set_palette(palette_t *palette) noexcept;
+ void fill(uint64_t color) noexcept { fill(color, m_cliprect); }
+ void fill(uint64_t color, const rectangle &bounds) noexcept;
+ void plot_box(int32_t x, int32_t y, int32_t width, int32_t height, uint64_t color) noexcept
{
fill(color, rectangle(x, x + width - 1, y, y + height - 1));
}
// pixel access
- void *raw_pixptr(int32_t y, int32_t x = 0) { return reinterpret_cast<uint8_t *>(m_base) + (y * m_rowpixels + x) * m_bpp / 8; }
- void const *raw_pixptr(int32_t y, int32_t x = 0) const { return reinterpret_cast<uint8_t *>(m_base) + (y * m_rowpixels + x) * m_bpp / 8; }
+ void *raw_pixptr(int32_t y, int32_t x = 0) noexcept { return reinterpret_cast<uint8_t *>(m_base) + (y * m_rowpixels + x) * m_bpp / 8; }
+ void const *raw_pixptr(int32_t y, int32_t x = 0) const noexcept { return reinterpret_cast<uint8_t *>(m_base) + (y * m_rowpixels + x) * m_bpp / 8; }
protected:
// for use by subclasses only to ensure type correctness
- template <typename PixelType> PixelType &pixt(int32_t y, int32_t x = 0) { return *(reinterpret_cast<PixelType *>(m_base) + y * m_rowpixels + x); }
- template <typename PixelType> PixelType const &pixt(int32_t y, int32_t x = 0) const { return *(reinterpret_cast<PixelType *>(m_base) + y * m_rowpixels + x); }
- void wrap(void *base, int width, int height, int rowpixels);
- void wrap(bitmap_t &source, const rectangle &subrect);
+ template <typename PixelType> PixelType &pixt(int32_t y, int32_t x = 0) noexcept { return *(reinterpret_cast<PixelType *>(m_base) + y * m_rowpixels + x); }
+ template <typename PixelType> PixelType const &pixt(int32_t y, int32_t x = 0) const noexcept { return *(reinterpret_cast<PixelType *>(m_base) + y * m_rowpixels + x); }
+ void wrap(void *base, int width, int height, int rowpixels) noexcept;
+ void wrap(bitmap_t &source, const rectangle &subrect) noexcept;
private:
// internal helpers
- int32_t compute_rowpixels(int width, int xslop);
- void compute_base(int xslop, int yslop);
- bool valid_format() const;
+ static int32_t compute_rowpixels(int width, int xslop) noexcept;
+ void compute_base(int xslop, int yslop) noexcept;
+ bool valid_format() const noexcept;
// internal state
std::unique_ptr<uint8_t []> m_alloc; // pointer to allocated pixel memory
@@ -214,26 +214,26 @@ class bitmap_specific : public bitmap_t
protected:
// construction/destruction -- subclasses only
- bitmap_specific(bitmap_specific<PixelType> &&) = default;
- bitmap_specific(bitmap_format format, int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap_t(format, PIXEL_BITS, width, height, xslop, yslop) { }
- bitmap_specific(bitmap_format format, PixelType *base, int width, int height, int rowpixels) : bitmap_t(format, PIXEL_BITS, base, width, height, rowpixels) { }
- bitmap_specific(bitmap_format format, bitmap_specific<PixelType> &source, const rectangle &subrect) : bitmap_t(format, PIXEL_BITS, source, subrect) { }
+ bitmap_specific(bitmap_specific<PixelType> &&) noexcept = default;
+ bitmap_specific(bitmap_format format, int width = 0, int height = 0, int xslop = 0, int yslop = 0) noexcept : bitmap_t(format, PIXEL_BITS, width, height, xslop, yslop) { }
+ bitmap_specific(bitmap_format format, PixelType *base, int width, int height, int rowpixels) noexcept : bitmap_t(format, PIXEL_BITS, base, width, height, rowpixels) { }
+ bitmap_specific(bitmap_format format, bitmap_specific<PixelType> &source, const rectangle &subrect) noexcept : bitmap_t(format, PIXEL_BITS, source, subrect) { }
- bitmap_specific<PixelType> &operator=(bitmap_specific<PixelType> &&) = default;
+ bitmap_specific<PixelType> &operator=(bitmap_specific<PixelType> &&) noexcept = default;
public:
using pixel_t = PixelType;
// getters
- uint8_t bpp() const { return PIXEL_BITS; }
+ uint8_t bpp() const noexcept { return PIXEL_BITS; }
// pixel accessors
- PixelType &pix(int32_t y, int32_t x = 0) { return pixt<PixelType>(y, x); }
- PixelType const &pix(int32_t y, int32_t x = 0) const { return pixt<PixelType>(y, x); }
+ PixelType &pix(int32_t y, int32_t x = 0) noexcept { return pixt<PixelType>(y, x); }
+ PixelType const &pix(int32_t y, int32_t x = 0) const noexcept { return pixt<PixelType>(y, x); }
// operations
- void fill(PixelType color) { fill(color, cliprect()); }
- void fill(PixelType color, const rectangle &bounds)
+ void fill(PixelType color) noexcept { fill(color, cliprect()); }
+ void fill(PixelType color, const rectangle &bounds) noexcept
{
// if we have a cliprect, intersect with that
rectangle fill(bounds);
@@ -244,7 +244,7 @@ public:
std::fill_n(&pix(y, fill.left()), fill.width(), color);
}
}
- void plot_box(int32_t x, int32_t y, int32_t width, int32_t height, PixelType color)
+ void plot_box(int32_t x, int32_t y, int32_t width, int32_t height, PixelType color) noexcept
{
fill(color, rectangle(x, x + width - 1, y, y + height - 1));
}
@@ -276,17 +276,17 @@ class bitmap_ind8 : public bitmap8_t
public:
// construction/destruction
- bitmap_ind8(bitmap_ind8 &&) = default;
- bitmap_ind8(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap8_t(k_bitmap_format, width, height, xslop, yslop) { }
- bitmap_ind8(uint8_t *base, int width, int height, int rowpixels) : bitmap8_t(k_bitmap_format, base, width, height, rowpixels) { }
- bitmap_ind8(bitmap_ind8 &source, const rectangle &subrect) : bitmap8_t(k_bitmap_format, source, subrect) { }
- void wrap(uint8_t *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); }
- void wrap(bitmap_ind8 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
+ bitmap_ind8(bitmap_ind8 &&) noexcept = default;
+ bitmap_ind8(int width = 0, int height = 0, int xslop = 0, int yslop = 0) noexcept : bitmap8_t(k_bitmap_format, width, height, xslop, yslop) { }
+ bitmap_ind8(uint8_t *base, int width, int height, int rowpixels) noexcept : bitmap8_t(k_bitmap_format, base, width, height, rowpixels) { }
+ bitmap_ind8(bitmap_ind8 &source, const rectangle &subrect) noexcept : bitmap8_t(k_bitmap_format, source, subrect) { }
+ void wrap(uint8_t *base, int width, int height, int rowpixels) noexcept { bitmap_t::wrap(base, width, height, rowpixels); }
+ void wrap(bitmap_ind8 &source, const rectangle &subrect) noexcept { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
// getters
- bitmap_format format() const { return k_bitmap_format; }
+ bitmap_format format() const noexcept { return k_bitmap_format; }
- bitmap_ind8 &operator=(bitmap_ind8 &&) = default;
+ bitmap_ind8 &operator=(bitmap_ind8 &&) noexcept = default;
};
// BITMAP_FORMAT_IND16 bitmaps
@@ -296,17 +296,17 @@ class bitmap_ind16 : public bitmap16_t
public:
// construction/destruction
- bitmap_ind16(bitmap_ind16 &&) = default;
- bitmap_ind16(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap16_t(k_bitmap_format, width, height, xslop, yslop) { }
- bitmap_ind16(uint16_t *base, int width, int height, int rowpixels) : bitmap16_t(k_bitmap_format, base, width, height, rowpixels) { }
- bitmap_ind16(bitmap_ind16 &source, const rectangle &subrect) : bitmap16_t(k_bitmap_format, source, subrect) { }
- void wrap(uint16_t *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); }
- void wrap(bitmap_ind16 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
+ bitmap_ind16(bitmap_ind16 &&) noexcept = default;
+ bitmap_ind16(int width = 0, int height = 0, int xslop = 0, int yslop = 0) noexcept : bitmap16_t(k_bitmap_format, width, height, xslop, yslop) { }
+ bitmap_ind16(uint16_t *base, int width, int height, int rowpixels) noexcept : bitmap16_t(k_bitmap_format, base, width, height, rowpixels) { }
+ bitmap_ind16(bitmap_ind16 &source, const rectangle &subrect) noexcept : bitmap16_t(k_bitmap_format, source, subrect) { }
+ void wrap(uint16_t *base, int width, int height, int rowpixels) noexcept { bitmap_t::wrap(base, width, height, rowpixels); }
+ void wrap(bitmap_ind16 &source, const rectangle &subrect) noexcept { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
// getters
- bitmap_format format() const { return k_bitmap_format; }
+ bitmap_format format() const noexcept { return k_bitmap_format; }
- bitmap_ind16 &operator=(bitmap_ind16 &&) = default;
+ bitmap_ind16 &operator=(bitmap_ind16 &&) noexcept = default;
};
// BITMAP_FORMAT_IND32 bitmaps
@@ -316,17 +316,17 @@ class bitmap_ind32 : public bitmap32_t
public:
// construction/destruction
- bitmap_ind32(bitmap_ind32 &&) = default;
- bitmap_ind32(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap32_t(k_bitmap_format, width, height, xslop, yslop) { }
- bitmap_ind32(uint32_t *base, int width, int height, int rowpixels) : bitmap32_t(k_bitmap_format, base, width, height, rowpixels) { }
- bitmap_ind32(bitmap_ind32 &source, const rectangle &subrect) : bitmap32_t(k_bitmap_format, source, subrect) { }
- void wrap(uint32_t *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); }
- void wrap(bitmap_ind32 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
+ bitmap_ind32(bitmap_ind32 &&) noexcept = default;
+ bitmap_ind32(int width = 0, int height = 0, int xslop = 0, int yslop = 0) noexcept : bitmap32_t(k_bitmap_format, width, height, xslop, yslop) { }
+ bitmap_ind32(uint32_t *base, int width, int height, int rowpixels) noexcept : bitmap32_t(k_bitmap_format, base, width, height, rowpixels) { }
+ bitmap_ind32(bitmap_ind32 &source, const rectangle &subrect) noexcept : bitmap32_t(k_bitmap_format, source, subrect) { }
+ void wrap(uint32_t *base, int width, int height, int rowpixels) noexcept { bitmap_t::wrap(base, width, height, rowpixels); }
+ void wrap(bitmap_ind32 &source, const rectangle &subrect) noexcept { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
// getters
- bitmap_format format() const { return k_bitmap_format; }
+ bitmap_format format() const noexcept { return k_bitmap_format; }
- bitmap_ind32 &operator=(bitmap_ind32 &&) = default;
+ bitmap_ind32 &operator=(bitmap_ind32 &&) noexcept = default;
};
// BITMAP_FORMAT_IND64 bitmaps
@@ -336,17 +336,17 @@ class bitmap_ind64 : public bitmap64_t
public:
// construction/destruction
- bitmap_ind64(bitmap_ind64 &&) = default;
- bitmap_ind64(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap64_t(k_bitmap_format, width, height, xslop, yslop) { }
- bitmap_ind64(uint64_t *base, int width, int height, int rowpixels) : bitmap64_t(k_bitmap_format, base, width, height, rowpixels) { }
- bitmap_ind64(bitmap_ind64 &source, const rectangle &subrect) : bitmap64_t(k_bitmap_format, source, subrect) { }
- void wrap(uint64_t *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); }
- void wrap(bitmap_ind64 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
+ bitmap_ind64(bitmap_ind64 &&) noexcept = default;
+ bitmap_ind64(int width = 0, int height = 0, int xslop = 0, int yslop = 0) noexcept : bitmap64_t(k_bitmap_format, width, height, xslop, yslop) { }
+ bitmap_ind64(uint64_t *base, int width, int height, int rowpixels) noexcept : bitmap64_t(k_bitmap_format, base, width, height, rowpixels) { }
+ bitmap_ind64(bitmap_ind64 &source, const rectangle &subrect) noexcept : bitmap64_t(k_bitmap_format, source, subrect) { }
+ void wrap(uint64_t *base, int width, int height, int rowpixels) noexcept { bitmap_t::wrap(base, width, height, rowpixels); }
+ void wrap(bitmap_ind64 &source, const rectangle &subrect) noexcept { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
// getters
- bitmap_format format() const { return k_bitmap_format; }
+ bitmap_format format() const noexcept { return k_bitmap_format; }
- bitmap_ind64 &operator=(bitmap_ind64 &&) = default;
+ bitmap_ind64 &operator=(bitmap_ind64 &&) noexcept = default;
};
@@ -359,17 +359,17 @@ class bitmap_yuy16 : public bitmap16_t
public:
// construction/destruction
- bitmap_yuy16(bitmap_yuy16 &&) = default;
- bitmap_yuy16(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap16_t(k_bitmap_format, width, height, xslop, yslop) { }
- bitmap_yuy16(uint16_t *base, int width, int height, int rowpixels) : bitmap16_t(k_bitmap_format, base, width, height, rowpixels) { }
- bitmap_yuy16(bitmap_yuy16 &source, const rectangle &subrect) : bitmap16_t(k_bitmap_format, source, subrect) { }
- void wrap(uint16_t *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); }
- void wrap(bitmap_yuy16 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
+ bitmap_yuy16(bitmap_yuy16 &&) noexcept = default;
+ bitmap_yuy16(int width = 0, int height = 0, int xslop = 0, int yslop = 0) noexcept : bitmap16_t(k_bitmap_format, width, height, xslop, yslop) { }
+ bitmap_yuy16(uint16_t *base, int width, int height, int rowpixels) noexcept : bitmap16_t(k_bitmap_format, base, width, height, rowpixels) { }
+ bitmap_yuy16(bitmap_yuy16 &source, const rectangle &subrect) noexcept : bitmap16_t(k_bitmap_format, source, subrect) { }
+ void wrap(uint16_t *base, int width, int height, int rowpixels) noexcept { bitmap_t::wrap(base, width, height, rowpixels); }
+ void wrap(bitmap_yuy16 &source, const rectangle &subrect) noexcept { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
// getters
- bitmap_format format() const { return k_bitmap_format; }
+ bitmap_format format() const noexcept { return k_bitmap_format; }
- bitmap_yuy16 &operator=(bitmap_yuy16 &&) = default;
+ bitmap_yuy16 &operator=(bitmap_yuy16 &&) noexcept = default;
};
// BITMAP_FORMAT_RGB32 bitmaps
@@ -379,17 +379,17 @@ class bitmap_rgb32 : public bitmap32_t
public:
// construction/destruction
- bitmap_rgb32(bitmap_rgb32 &&) = default;
- bitmap_rgb32(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap32_t(k_bitmap_format, width, height, xslop, yslop) { }
- bitmap_rgb32(uint32_t *base, int width, int height, int rowpixels) : bitmap32_t(k_bitmap_format, base, width, height, rowpixels) { }
- bitmap_rgb32(bitmap_rgb32 &source, const rectangle &subrect) : bitmap32_t(k_bitmap_format, source, subrect) { }
- void wrap(uint32_t *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); }
- void wrap(bitmap_rgb32 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
+ bitmap_rgb32(bitmap_rgb32 &&) noexcept = default;
+ bitmap_rgb32(int width = 0, int height = 0, int xslop = 0, int yslop = 0) noexcept : bitmap32_t(k_bitmap_format, width, height, xslop, yslop) { }
+ bitmap_rgb32(uint32_t *base, int width, int height, int rowpixels) noexcept : bitmap32_t(k_bitmap_format, base, width, height, rowpixels) { }
+ bitmap_rgb32(bitmap_rgb32 &source, const rectangle &subrect) noexcept : bitmap32_t(k_bitmap_format, source, subrect) { }
+ void wrap(uint32_t *base, int width, int height, int rowpixels) noexcept { bitmap_t::wrap(base, width, height, rowpixels); }
+ void wrap(bitmap_rgb32 &source, const rectangle &subrect) noexcept { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
// getters
- bitmap_format format() const { return k_bitmap_format; }
+ bitmap_format format() const noexcept { return k_bitmap_format; }
- bitmap_rgb32 &operator=(bitmap_rgb32 &&) = default;
+ bitmap_rgb32 &operator=(bitmap_rgb32 &&) noexcept = default;
};
// BITMAP_FORMAT_ARGB32 bitmaps
@@ -399,17 +399,17 @@ class bitmap_argb32 : public bitmap32_t
public:
// construction/destruction
- bitmap_argb32(bitmap_argb32 &&) = default;
- bitmap_argb32(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap32_t(k_bitmap_format, width, height, xslop, yslop) { }
- bitmap_argb32(uint32_t *base, int width, int height, int rowpixels) : bitmap32_t(k_bitmap_format, base, width, height, rowpixels) { }
- bitmap_argb32(bitmap_argb32 &source, const rectangle &subrect) : bitmap32_t(k_bitmap_format, source, subrect) { }
- void wrap(uint32_t *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); }
- void wrap(bitmap_argb32 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
+ bitmap_argb32(bitmap_argb32 &&) noexcept = default;
+ bitmap_argb32(int width = 0, int height = 0, int xslop = 0, int yslop = 0) noexcept : bitmap32_t(k_bitmap_format, width, height, xslop, yslop) { }
+ bitmap_argb32(uint32_t *base, int width, int height, int rowpixels) noexcept : bitmap32_t(k_bitmap_format, base, width, height, rowpixels) { }
+ bitmap_argb32(bitmap_argb32 &source, const rectangle &subrect) noexcept : bitmap32_t(k_bitmap_format, source, subrect) { }
+ void wrap(uint32_t *base, int width, int height, int rowpixels) noexcept { bitmap_t::wrap(base, width, height, rowpixels); }
+ void wrap(bitmap_argb32 &source, const rectangle &subrect) noexcept { bitmap_t::wrap(static_cast<bitmap_t &>(source), subrect); }
// getters
- bitmap_format format() const { return k_bitmap_format; }
+ bitmap_format format() const noexcept { return k_bitmap_format; }
- bitmap_argb32 &operator=(bitmap_argb32 &&) = default;
+ bitmap_argb32 &operator=(bitmap_argb32 &&) noexcept = default;
};
#endif // MAME_UTIL_BITMAP_H
diff --git a/src/lib/util/corefile.cpp b/src/lib/util/corefile.cpp
index 4fed0e0a28b..3d5c705ab86 100644
--- a/src/lib/util/corefile.cpp
+++ b/src/lib/util/corefile.cpp
@@ -63,7 +63,7 @@ public:
virtual char *gets(char *s, int n) override { return m_file.gets(s, n); }
virtual int puts(std::string_view s) override { return m_file.puts(s); }
- virtual int vprintf(util::format_argument_pack<std::ostream> const &args) override { return m_file.vprintf(args); }
+ virtual int vprintf(util::format_argument_pack<char> const &args) override { return m_file.vprintf(args); }
virtual std::error_condition truncate(std::uint64_t offset) override { return m_file.truncate(offset); }
private:
@@ -88,7 +88,7 @@ public:
virtual int ungetc(int c) override;
virtual char *gets(char *s, int n) override;
virtual int puts(std::string_view s) override;
- virtual int vprintf(util::format_argument_pack<std::ostream> const &args) override;
+ virtual int vprintf(util::format_argument_pack<char> const &args) override;
protected:
core_text_file(std::uint32_t openflags)
@@ -534,12 +534,12 @@ int core_text_file::puts(std::string_view s)
// vprintf - vfprintf to a text file
//-------------------------------------------------
-int core_text_file::vprintf(util::format_argument_pack<std::ostream> const &args)
+int core_text_file::vprintf(util::format_argument_pack<char> const &args)
{
m_printf_buffer.clear();
m_printf_buffer.reserve(1024);
m_printf_buffer.seekp(0, ovectorstream::beg);
- util::stream_format<std::ostream, std::ostream>(m_printf_buffer, args);
+ util::stream_format(m_printf_buffer, args);
return puts(buf_to_string_view(m_printf_buffer));
}
diff --git a/src/lib/util/corefile.h b/src/lib/util/corefile.h
index 6a7d14ea439..315645d4e2c 100644
--- a/src/lib/util/corefile.h
+++ b/src/lib/util/corefile.h
@@ -87,7 +87,7 @@ public:
virtual int puts(std::string_view s) = 0;
// printf-style text write to a file
- virtual int vprintf(util::format_argument_pack<std::ostream> const &args) = 0;
+ virtual int vprintf(util::format_argument_pack<char> const &args) = 0;
template <typename Format, typename... Params> int printf(Format &&fmt, Params &&...args)
{
return vprintf(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...));
diff --git a/src/lib/util/palette.cpp b/src/lib/util/palette.cpp
index 730800d5249..612dc9042be 100644
--- a/src/lib/util/palette.cpp
+++ b/src/lib/util/palette.cpp
@@ -8,12 +8,12 @@
******************************************************************************/
-#include <cassert>
-
#include "palette.h"
-#include <cstdlib>
-#include <cmath>
+
#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <cstdlib>
//**************************************************************************
@@ -44,9 +44,7 @@ inline rgb_t palette_t::adjust_palette_entry(rgb_t entry, float brightness, floa
// dirty_state - constructor
//-------------------------------------------------
-palette_client::dirty_state::dirty_state()
- : m_mindirty(0),
- m_maxdirty(0)
+palette_client::dirty_state::dirty_state() : m_mindirty(0), m_maxdirty(0)
{
}
@@ -56,7 +54,7 @@ palette_client::dirty_state::dirty_state()
// min/max values
//-------------------------------------------------
-const uint32_t *palette_client::dirty_state::dirty_list(uint32_t &mindirty, uint32_t &maxdirty)
+const uint32_t *palette_client::dirty_state::dirty_list(uint32_t &mindirty, uint32_t &maxdirty) noexcept
{
// fill in the mindirty/maxdirty
mindirty = m_mindirty;
@@ -92,7 +90,7 @@ void palette_client::dirty_state::resize(uint32_t colors)
// mark_dirty - mark a single entry dirty
//-------------------------------------------------
-void palette_client::dirty_state::mark_dirty(uint32_t index)
+void palette_client::dirty_state::mark_dirty(uint32_t index) noexcept
{
m_dirty[index / 32] |= 1 << (index % 32);
m_mindirty = std::min(m_mindirty, index);
@@ -105,7 +103,7 @@ void palette_client::dirty_state::mark_dirty(uint32_t index)
// entries as clean
//-------------------------------------------------
-void palette_client::dirty_state::reset()
+void palette_client::dirty_state::reset() noexcept
{
// erase relevant entries in the new live one
if (m_mindirty <= m_maxdirty)
@@ -168,20 +166,18 @@ palette_client::~palette_client()
// list for a client
//-------------------------------------------------
-const uint32_t *palette_client::dirty_list(uint32_t &mindirty, uint32_t &maxdirty)
+const uint32_t *palette_client::dirty_list(uint32_t &mindirty, uint32_t &maxdirty) noexcept
{
// if nothing to report, report nothing and don't swap
- const uint32_t *result = m_live->dirty_list(mindirty, maxdirty);
- if (result == nullptr)
- return nullptr;
-
- // swap the live and previous lists
- dirty_state *temp = m_live;
- m_live = m_previous;
- m_previous = temp;
+ uint32_t const *const result = m_live->dirty_list(mindirty, maxdirty);
+ if (result)
+ {
+ // swap the live and previous lists
+ std::swap(m_live, m_previous);
- // reset new live one and return the pointer to the previous
- m_live->reset();
+ // reset new live one and return the pointer to the previous
+ m_live->reset();
+ }
return result;
}
@@ -266,7 +262,7 @@ palette_t::~palette_t()
// palette_t - destructor
//-------------------------------------------------
-void palette_t::deref()
+void palette_t::deref() noexcept
{
if (--m_refcount == 0)
delete this;
diff --git a/src/lib/util/palette.h b/src/lib/util/palette.h
index d21c8ca8125..269389b67d6 100644
--- a/src/lib/util/palette.h
+++ b/src/lib/util/palette.h
@@ -100,12 +100,12 @@ public:
~palette_client();
// getters
- palette_client *next() const { return m_next; }
- palette_t &palette() const { return m_palette; }
- const uint32_t *dirty_list(uint32_t &mindirty, uint32_t &maxdirty);
+ palette_client *next() const noexcept { return m_next; }
+ palette_t &palette() const noexcept { return m_palette; }
+ const uint32_t *dirty_list(uint32_t &mindirty, uint32_t &maxdirty) noexcept;
// dirty marking
- void mark_dirty(uint32_t index) { m_live->mark_dirty(index); }
+ void mark_dirty(uint32_t index) noexcept { m_live->mark_dirty(index); }
private:
// internal object to track dirty states
@@ -116,10 +116,10 @@ private:
dirty_state();
// operations
- const uint32_t *dirty_list(uint32_t &mindirty, uint32_t &maxdirty);
+ const uint32_t *dirty_list(uint32_t &mindirty, uint32_t &maxdirty) noexcept;
void resize(uint32_t colors);
- void mark_dirty(uint32_t index);
- void reset();
+ void mark_dirty(uint32_t index) noexcept;
+ void reset() noexcept;
private:
// internal state
@@ -149,15 +149,15 @@ public:
static palette_t *alloc(uint32_t numcolors, uint32_t numgroups = 1);
// reference counting
- void ref() { m_refcount++; }
- void deref();
+ void ref() noexcept { m_refcount++; }
+ void deref() noexcept;
// getters
- int num_colors() const { return m_numcolors; }
- int num_groups() const { return m_numgroups; }
- int max_index() const { return m_numcolors * m_numgroups + 2; }
- uint32_t black_entry() const { return m_numcolors * m_numgroups + 0; }
- uint32_t white_entry() const { return m_numcolors * m_numgroups + 1; }
+ int num_colors() const noexcept { return m_numcolors; }
+ int num_groups() const noexcept { return m_numgroups; }
+ int max_index() const noexcept { return m_numcolors * m_numgroups + 2; }
+ uint32_t black_entry() const noexcept { return m_numcolors * m_numgroups + 0; }
+ uint32_t white_entry() const noexcept { return m_numcolors * m_numgroups + 1; }
// overall adjustments
void set_brightness(float brightness);
@@ -165,9 +165,9 @@ public:
void set_gamma(float gamma);
// entry getters
- rgb_t entry_color(uint32_t index) const { return (index < m_numcolors) ? m_entry_color[index] : rgb_t::black(); }
- rgb_t entry_adjusted_color(uint32_t index) const { return (index < m_numcolors * m_numgroups) ? m_adjusted_color[index] : rgb_t::black(); }
- float entry_contrast(uint32_t index) const { return (index < m_numcolors) ? m_entry_contrast[index] : 1.0f; }
+ rgb_t entry_color(uint32_t index) const noexcept { return (index < m_numcolors) ? m_entry_color[index] : rgb_t::black(); }
+ rgb_t entry_adjusted_color(uint32_t index) const noexcept { return (index < m_numcolors * m_numgroups) ? m_adjusted_color[index] : rgb_t::black(); }
+ float entry_contrast(uint32_t index) const noexcept { return (index < m_numcolors) ? m_entry_contrast[index] : 1.0f; }
// entry setters
void entry_set_color(uint32_t index, rgb_t rgb);
@@ -177,9 +177,9 @@ public:
void entry_set_contrast(uint32_t index, float contrast);
// entry list getters
- const rgb_t *entry_list_raw() const { return &m_entry_color[0]; }
- const rgb_t *entry_list_adjusted() const { return &m_adjusted_color[0]; }
- const rgb_t *entry_list_adjusted_rgb15() const { return &m_adjusted_rgb15[0]; }
+ const rgb_t *entry_list_raw() const noexcept { return &m_entry_color[0]; }
+ const rgb_t *entry_list_adjusted() const noexcept { return &m_adjusted_color[0]; }
+ const rgb_t *entry_list_adjusted_rgb15() const noexcept { return &m_adjusted_rgb15[0]; }
// group adjustments
void group_set_brightness(uint32_t group, float brightness);
@@ -198,14 +198,14 @@ private:
void update_adjusted_color(uint32_t group, uint32_t index);
// internal state
- uint32_t m_refcount; // reference count on the palette
- uint32_t m_numcolors; // number of colors in the palette
- uint32_t m_numgroups; // number of groups in the palette
-
- float m_brightness; // overall brightness value
- float m_contrast; // overall contrast value
- float m_gamma; // overall gamma value
- uint8_t m_gamma_map[256]; // gamma map
+ uint32_t m_refcount; // reference count on the palette
+ uint32_t m_numcolors; // number of colors in the palette
+ uint32_t m_numgroups; // number of groups in the palette
+
+ float m_brightness; // overall brightness value
+ float m_contrast; // overall contrast value
+ float m_gamma; // overall gamma value
+ uint8_t m_gamma_map[256]; // gamma map
std::vector<rgb_t> m_entry_color; // array of raw colors
std::vector<float> m_entry_contrast; // contrast value for each entry
diff --git a/src/lib/util/strformat.cpp b/src/lib/util/strformat.cpp
index cec14635e16..47bfdde6715 100644
--- a/src/lib/util/strformat.cpp
+++ b/src/lib/util/strformat.cpp
@@ -23,639 +23,126 @@ template class format_chars<wchar_t>;
template void format_flags::apply(std::ostream &) const;
template void format_flags::apply(std::wostream &) const;
-template void format_flags::apply(std::iostream &) const;
-template void format_flags::apply(std::wiostream &) const;
-template void format_flags::apply(std::ostringstream &) const;
-template void format_flags::apply(std::wostringstream &) const;
-template void format_flags::apply(std::stringstream &) const;
-template void format_flags::apply(std::wstringstream &) const;
-template void format_flags::apply(ovectorstream &) const;
-template void format_flags::apply(wovectorstream &) const;
-template void format_flags::apply(vectorstream &) const;
-template void format_flags::apply(wvectorstream &) const;
-template class format_argument<std::ostream>;
-template void format_argument<std::ostream>::static_output<char>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<signed char>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<unsigned char>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<short>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<unsigned short>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<int>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<unsigned int>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<long>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<unsigned long>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<long long>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<unsigned long long>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<char *>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<char const *>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<std::string>(std::ostream &, format_flags const &, void const *);
-template void format_argument<std::ostream>::static_output<std::string_view>(std::ostream &, format_flags const &, void const *);
-template bool format_argument<std::ostream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<char *>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<char const *>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<std::string>(void const *, int &);
-template bool format_argument<std::ostream>::static_make_integer<std::string_view>(void const *, int &);
-template void format_argument<std::ostream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<char *>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<char const *>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<std::string>(void const *, std::streamoff);
-template void format_argument<std::ostream>::static_store_integer<std::string_view>(void const *, std::streamoff);
+template class format_argument<char>;
+template void format_argument<char>::static_output<bool>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<char>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<signed char>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<unsigned char>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<short>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<unsigned short>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<int>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<unsigned int>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<long>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<unsigned long>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<long long>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<unsigned long long>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<char *>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<char const *>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<std::string>(std::ostream &, format_flags const &, void const *);
+template void format_argument<char>::static_output<std::string_view>(std::ostream &, format_flags const &, void const *);
+template bool format_argument<char>::static_make_integer<bool>(void const *, int &);
+template bool format_argument<char>::static_make_integer<char>(void const *, int &);
+template bool format_argument<char>::static_make_integer<signed char>(void const *, int &);
+template bool format_argument<char>::static_make_integer<unsigned char>(void const *, int &);
+template bool format_argument<char>::static_make_integer<short>(void const *, int &);
+template bool format_argument<char>::static_make_integer<unsigned short>(void const *, int &);
+template bool format_argument<char>::static_make_integer<int>(void const *, int &);
+template bool format_argument<char>::static_make_integer<unsigned int>(void const *, int &);
+template bool format_argument<char>::static_make_integer<long>(void const *, int &);
+template bool format_argument<char>::static_make_integer<unsigned long>(void const *, int &);
+template bool format_argument<char>::static_make_integer<long long>(void const *, int &);
+template bool format_argument<char>::static_make_integer<unsigned long long>(void const *, int &);
+template bool format_argument<char>::static_make_integer<char *>(void const *, int &);
+template bool format_argument<char>::static_make_integer<char const *>(void const *, int &);
+template bool format_argument<char>::static_make_integer<std::string>(void const *, int &);
+template bool format_argument<char>::static_make_integer<std::string_view>(void const *, int &);
+template void format_argument<char>::static_store_integer<bool>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<char>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<signed char>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<unsigned char>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<short>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<unsigned short>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<int>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<unsigned int>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<long>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<unsigned long>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<long long>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<unsigned long long>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<char *>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<char const *>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<std::string>(void const *, std::streamoff);
+template void format_argument<char>::static_store_integer<std::string_view>(void const *, std::streamoff);
+
+template class format_argument<wchar_t>;
+template void format_argument<wchar_t>::static_output<bool>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<char>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<signed char>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<unsigned char>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<wchar_t>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<short>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<unsigned short>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<int>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<unsigned int>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<long>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<unsigned long>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<long long>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<unsigned long long>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<wchar_t *>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<wchar_t const *>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<std::wstring>(std::wostream &, format_flags const &, void const *);
+template void format_argument<wchar_t>::static_output<std::wstring_view>(std::wostream &, format_flags const &, void const *);
+template bool format_argument<wchar_t>::static_make_integer<bool>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<char>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<signed char>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<unsigned char>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<wchar_t>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<short>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<unsigned short>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<int>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<unsigned int>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<long>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<unsigned long>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<long long>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<unsigned long long>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<wchar_t *>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<wchar_t const *>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<std::wstring>(void const *, int &);
+template bool format_argument<wchar_t>::static_make_integer<std::wstring_view>(void const *, int &);
+template void format_argument<wchar_t>::static_store_integer<bool>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<char>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<signed char>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<unsigned char>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<wchar_t>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<short>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<unsigned short>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<int>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<unsigned int>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<long>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<unsigned long>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<long long>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<unsigned long long>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<wchar_t *>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<std::wstring>(void const *, std::streamoff);
+template void format_argument<wchar_t>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
+
+template class format_argument_pack<char>;
+template class format_argument_pack<wchar_t>;
+
+template std::ostream::off_type stream_format(std::ostream &, format_argument_pack<char> const &);
+template std::wostream::off_type stream_format(std::wostream &, format_argument_pack<wchar_t> const &);
-template class format_argument<std::wostream>;
-template void format_argument<std::wostream>::static_output<char>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<signed char>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<unsigned char>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<wchar_t>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<short>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<unsigned short>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<int>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<unsigned int>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<long>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<unsigned long>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<long long>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<unsigned long long>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<wchar_t *>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<wchar_t const *>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<std::wstring>(std::wostream &, format_flags const &, void const *);
-template void format_argument<std::wostream>::static_output<std::wstring_view>(std::wostream &, format_flags const &, void const *);
-template bool format_argument<std::wostream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<wchar_t>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<wchar_t *>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<wchar_t const *>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<std::wstring>(void const *, int &);
-template bool format_argument<std::wostream>::static_make_integer<std::wstring_view>(void const *, int &);
-template void format_argument<std::wostream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-template void format_argument<std::wostream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-template class format_argument<std::iostream>;
-template void format_argument<std::iostream>::static_output<char>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<signed char>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<unsigned char>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<short>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<unsigned short>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<int>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<unsigned int>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<long>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<unsigned long>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<long long>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<unsigned long long>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<char *>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<char const *>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<std::string>(std::iostream &, format_flags const &, void const *);
-template void format_argument<std::iostream>::static_output<std::string_view>(std::iostream &, format_flags const &, void const *);
-template bool format_argument<std::iostream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<char *>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<char const *>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<std::string>(void const *, int &);
-template bool format_argument<std::iostream>::static_make_integer<std::string_view>(void const *, int &);
-template void format_argument<std::iostream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<char *>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<char const *>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<std::string>(void const *, std::streamoff);
-template void format_argument<std::iostream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-template class format_argument<std::wiostream>;
-template void format_argument<std::wiostream>::static_output<char>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<signed char>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<unsigned char>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<wchar_t>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<short>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<unsigned short>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<int>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<unsigned int>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<long>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<unsigned long>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<long long>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<unsigned long long>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<wchar_t *>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<wchar_t const *>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<std::wstring>(std::wiostream &, format_flags const &, void const *);
-template void format_argument<std::wiostream>::static_output<std::wstring_view>(std::wiostream &, format_flags const &, void const *);
-template bool format_argument<std::wiostream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<wchar_t>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<wchar_t *>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<wchar_t const *>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<std::wstring>(void const *, int &);
-template bool format_argument<std::wiostream>::static_make_integer<std::wstring_view>(void const *, int &);
-template void format_argument<std::wiostream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-template void format_argument<std::wiostream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-template class format_argument<std::ostringstream>;
-template void format_argument<std::ostringstream>::static_output<char>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<signed char>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<unsigned char>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<short>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<unsigned short>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<int>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<unsigned int>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<long>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<unsigned long>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<long long>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<unsigned long long>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<char *>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<char const *>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<std::string>(std::ostringstream &, format_flags const &, void const *);
-template void format_argument<std::ostringstream>::static_output<std::string_view>(std::ostringstream &, format_flags const &, void const *);
-template bool format_argument<std::ostringstream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<char *>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<char const *>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<std::string>(void const *, int &);
-template bool format_argument<std::ostringstream>::static_make_integer<std::string_view>(void const *, int &);
-template void format_argument<std::ostringstream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<char *>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<char const *>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<std::string>(void const *, std::streamoff);
-template void format_argument<std::ostringstream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-template class format_argument<std::wostringstream>;
-template void format_argument<std::wostringstream>::static_output<char>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<signed char>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<unsigned char>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<wchar_t>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<short>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<unsigned short>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<int>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<unsigned int>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<long>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<unsigned long>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<long long>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<unsigned long long>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<wchar_t *>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<wchar_t const *>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<std::wstring>(std::wostringstream &, format_flags const &, void const *);
-template void format_argument<std::wostringstream>::static_output<std::wstring_view>(std::wostringstream &, format_flags const &, void const *);
-template bool format_argument<std::wostringstream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<wchar_t>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<wchar_t *>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<wchar_t const *>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<std::wstring>(void const *, int &);
-template bool format_argument<std::wostringstream>::static_make_integer<std::wstring_view>(void const *, int &);
-template void format_argument<std::wostringstream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-template void format_argument<std::wostringstream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-template class format_argument<std::stringstream>;
-template void format_argument<std::stringstream>::static_output<char>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<signed char>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<unsigned char>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<short>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<unsigned short>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<int>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<unsigned int>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<long>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<unsigned long>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<long long>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<unsigned long long>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<char *>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<char const *>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<std::string>(std::stringstream &, format_flags const &, void const *);
-template void format_argument<std::stringstream>::static_output<std::string_view>(std::stringstream &, format_flags const &, void const *);
-template bool format_argument<std::stringstream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<char *>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<char const *>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<std::string>(void const *, int &);
-template bool format_argument<std::stringstream>::static_make_integer<std::string_view>(void const *, int &);
-template void format_argument<std::stringstream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<char *>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<char const *>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<std::string>(void const *, std::streamoff);
-template void format_argument<std::stringstream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-template class format_argument<std::wstringstream>;
-template void format_argument<std::wstringstream>::static_output<char>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<signed char>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<unsigned char>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<wchar_t>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<short>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<unsigned short>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<int>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<unsigned int>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<long>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<unsigned long>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<long long>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<unsigned long long>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<wchar_t *>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<wchar_t const *>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<std::wstring>(std::wstringstream &, format_flags const &, void const *);
-template void format_argument<std::wstringstream>::static_output<std::wstring_view>(std::wstringstream &, format_flags const &, void const *);
-template bool format_argument<std::wstringstream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<wchar_t>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<wchar_t *>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<wchar_t const *>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<std::wstring>(void const *, int &);
-template bool format_argument<std::wstringstream>::static_make_integer<std::wstring_view>(void const *, int &);
-template void format_argument<std::wstringstream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-template void format_argument<std::wstringstream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-template class format_argument<ovectorstream>;
-template void format_argument<ovectorstream>::static_output<char>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<signed char>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<unsigned char>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<short>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<unsigned short>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<int>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<unsigned int>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<long>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<unsigned long>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<long long>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<unsigned long long>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<char *>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<char const *>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<std::string>(ovectorstream &, format_flags const &, void const *);
-template void format_argument<ovectorstream>::static_output<std::string_view>(ovectorstream &, format_flags const &, void const *);
-template bool format_argument<ovectorstream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<char *>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<char const *>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<std::string>(void const *, int &);
-template bool format_argument<ovectorstream>::static_make_integer<std::string_view>(void const *, int &);
-template void format_argument<ovectorstream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<char *>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<char const *>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<std::string>(void const *, std::streamoff);
-template void format_argument<ovectorstream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-template class format_argument<wovectorstream>;
-template void format_argument<wovectorstream>::static_output<char>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<signed char>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<unsigned char>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<wchar_t>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<short>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<unsigned short>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<int>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<unsigned int>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<long>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<unsigned long>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<long long>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<unsigned long long>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<wchar_t *>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<wchar_t const *>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<std::wstring>(wovectorstream &, format_flags const &, void const *);
-template void format_argument<wovectorstream>::static_output<std::wstring_view>(wovectorstream &, format_flags const &, void const *);
-template bool format_argument<wovectorstream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<wchar_t>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<wchar_t *>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<wchar_t const *>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<std::wstring>(void const *, int &);
-template bool format_argument<wovectorstream>::static_make_integer<std::wstring_view>(void const *, int &);
-template void format_argument<wovectorstream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-template void format_argument<wovectorstream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-template class format_argument<vectorstream>;
-template void format_argument<vectorstream>::static_output<char>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<signed char>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<unsigned char>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<short>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<unsigned short>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<int>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<unsigned int>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<long>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<unsigned long>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<long long>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<unsigned long long>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<char *>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<char const *>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<std::string>(vectorstream &, format_flags const &, void const *);
-template void format_argument<vectorstream>::static_output<std::string_view>(vectorstream &, format_flags const &, void const *);
-template bool format_argument<vectorstream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<char *>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<char const *>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<std::string>(void const *, int &);
-template bool format_argument<vectorstream>::static_make_integer<std::string_view>(void const *, int &);
-template void format_argument<vectorstream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<char *>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<char const *>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<std::string>(void const *, std::streamoff);
-template void format_argument<vectorstream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-template class format_argument<wvectorstream>;
-template void format_argument<wvectorstream>::static_output<char>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<signed char>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<unsigned char>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<wchar_t>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<short>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<unsigned short>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<int>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<unsigned int>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<long>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<unsigned long>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<long long>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<unsigned long long>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<wchar_t *>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<wchar_t const *>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<std::wstring>(wvectorstream &, format_flags const &, void const *);
-template void format_argument<wvectorstream>::static_output<std::wstring_view>(wvectorstream &, format_flags const &, void const *);
-template bool format_argument<wvectorstream>::static_make_integer<char>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<signed char>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<unsigned char>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<wchar_t>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<short>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<unsigned short>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<int>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<unsigned int>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<long>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<unsigned long>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<long long>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<unsigned long long>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<wchar_t *>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<wchar_t const *>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<std::wstring>(void const *, int &);
-template bool format_argument<wvectorstream>::static_make_integer<std::wstring_view>(void const *, int &);
-template void format_argument<wvectorstream>::static_store_integer<char>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<signed char>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<short>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<int>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<long>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<long long>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-template void format_argument<wvectorstream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-template class format_argument_pack<std::ostream>;
-template class format_argument_pack<std::wostream>;
-template class format_argument_pack<std::iostream>;
-template class format_argument_pack<std::wiostream>;
-template class format_argument_pack<std::ostringstream>;
-template class format_argument_pack<std::wostringstream>;
-template class format_argument_pack<std::stringstream>;
-template class format_argument_pack<std::wstringstream>;
-template class format_argument_pack<ovectorstream>;
-template class format_argument_pack<wovectorstream>;
-template class format_argument_pack<vectorstream>;
-template class format_argument_pack<wvectorstream>;
+} // namespace detail
-template std::ostream::off_type stream_format(std::ostream &, format_argument_pack<std::ostream> const &);
-template std::wostream::off_type stream_format(std::wostream &, format_argument_pack<std::wostream> const &);
-template std::iostream::off_type stream_format(std::iostream &, format_argument_pack<std::ostream> const &);
-template std::iostream::off_type stream_format(std::iostream &, format_argument_pack<std::iostream> const &);
-template std::wiostream::off_type stream_format(std::wiostream &, format_argument_pack<std::wostream> const &);
-template std::wiostream::off_type stream_format(std::wiostream &, format_argument_pack<std::wiostream> const &);
-template std::ostringstream::off_type stream_format(std::ostringstream &, format_argument_pack<std::ostream> const &);
-template std::ostringstream::off_type stream_format(std::ostringstream &, format_argument_pack<std::ostringstream> const &);
-template std::wostringstream::off_type stream_format(std::wostringstream &, format_argument_pack<std::wostream> const &);
-template std::wostringstream::off_type stream_format(std::wostringstream &, format_argument_pack<std::wostringstream> const &);
-template std::stringstream::off_type stream_format(std::stringstream &, format_argument_pack<std::ostream> const &);
-template std::stringstream::off_type stream_format(std::stringstream &, format_argument_pack<std::iostream> const &);
-template std::stringstream::off_type stream_format(std::stringstream &, format_argument_pack<std::stringstream> const &);
-template std::wstringstream::off_type stream_format(std::wstringstream &, format_argument_pack<std::wostream> const &);
-template std::wstringstream::off_type stream_format(std::wstringstream &, format_argument_pack<std::wiostream> const &);
-template std::wstringstream::off_type stream_format(std::wstringstream &, format_argument_pack<std::wstringstream> const &);
-template ovectorstream::off_type stream_format(ovectorstream &, format_argument_pack<std::ostream> const &);
-template ovectorstream::off_type stream_format(ovectorstream &, format_argument_pack<ovectorstream> const &);
-template wovectorstream::off_type stream_format(wovectorstream &, format_argument_pack<std::wostream> const &);
-template wovectorstream::off_type stream_format(wovectorstream &, format_argument_pack<wovectorstream> const &);
-template vectorstream::off_type stream_format(vectorstream &, format_argument_pack<std::ostream> const &);
-template vectorstream::off_type stream_format(vectorstream &, format_argument_pack<std::iostream> const &);
-template vectorstream::off_type stream_format(vectorstream &, format_argument_pack<vectorstream> const &);
-template wvectorstream::off_type stream_format(wvectorstream &, format_argument_pack<std::wostream> const &);
-template wvectorstream::off_type stream_format(wvectorstream &, format_argument_pack<std::wiostream> const &);
-template wvectorstream::off_type stream_format(wvectorstream &, format_argument_pack<wvectorstream> const &);
+template std::string string_format(format_argument_pack<char> const &);
+template std::string string_format(format_argument_pack<char> &&);
+template std::string string_format(std::locale const &, format_argument_pack<char> const &);
+template std::string string_format(std::locale const &, format_argument_pack<char> &&);
-} // namespace detail
+template std::wstring string_format(format_argument_pack<wchar_t> const &);
+template std::wstring string_format(format_argument_pack<wchar_t> &&);
+template std::wstring string_format(std::locale const &, format_argument_pack<wchar_t> const &);
+template std::wstring string_format(std::locale const &, format_argument_pack<wchar_t> &&);
} // namespace util
diff --git a/src/lib/util/strformat.h b/src/lib/util/strformat.h
index e6d2ee0a0fe..e68cacec529 100644
--- a/src/lib/util/strformat.h
+++ b/src/lib/util/strformat.h
@@ -173,8 +173,6 @@
#pragma once
-#include "vecstream.h"
-
#include <algorithm>
#include <array>
#include <cassert>
@@ -360,52 +358,54 @@ public:
{
}
- template <typename Stream> void apply(Stream &stream) const
+ template <typename Character, typename Traits = std::char_traits<Character> >
+ void apply(std::basic_ostream<Character, Traits> &stream) const
{
- typedef format_chars<typename Stream::char_type> chars;
+ using stream_type = std::basic_ostream<Character, Traits>;
+ using chars = format_chars<Character>;
stream.unsetf(
- Stream::basefield |
- Stream::adjustfield |
- Stream::floatfield |
- Stream::boolalpha |
- Stream::showbase |
- Stream::showpoint |
- Stream::showpos |
- Stream::uppercase);
-
- if (get_alternate_format()) stream.setf(Stream::showbase | Stream::showpoint);
+ stream_type::basefield |
+ stream_type::adjustfield |
+ stream_type::floatfield |
+ stream_type::boolalpha |
+ stream_type::showbase |
+ stream_type::showpoint |
+ stream_type::showpos |
+ stream_type::uppercase);
+
+ if (get_alternate_format()) stream.setf(stream_type::showbase | stream_type::showpoint);
stream.fill(get_zero_pad() ? chars::zero : chars::space);
- stream.setf(get_left_align() ? Stream::left : get_zero_pad() ? Stream::internal : Stream::right);
- if (positive_sign::plus == get_positive_sign()) stream.setf(Stream::showpos);
+ stream.setf(get_left_align() ? stream_type::left : get_zero_pad() ? stream_type::internal : stream_type::right);
+ if (positive_sign::plus == get_positive_sign()) stream.setf(stream_type::showpos);
stream.precision((get_precision() < 0) ? 6 : get_precision());
stream.width(get_field_width());
- if (get_uppercase()) stream.setf(Stream::uppercase);
+ if (get_uppercase()) stream.setf(stream_type::uppercase);
switch (get_conversion())
{
case conversion::unspecified:
break;
case conversion::signed_decimal:
case conversion::unsigned_decimal:
- stream.setf(Stream::dec);
+ stream.setf(stream_type::dec);
break;
case conversion::octal:
- stream.setf(Stream::oct);
+ stream.setf(stream_type::oct);
break;
case conversion::hexadecimal:
- stream.setf(Stream::hex | Stream::scientific | Stream::fixed);
+ stream.setf(stream_type::hex | stream_type::scientific | stream_type::fixed);
break;
case conversion::scientific_decimal:
- stream.setf(Stream::dec | Stream::scientific);
+ stream.setf(stream_type::dec | stream_type::scientific);
break;
case conversion::fixed_decimal:
- stream.setf(Stream::dec | Stream::fixed);
+ stream.setf(stream_type::dec | stream_type::fixed);
break;
case conversion::floating_decimal:
- stream.setf(Stream::dec);
+ stream.setf(stream_type::dec);
break;
case conversion::scientific_hexadecimal:
- stream.setf(Stream::hex | Stream::scientific | Stream::fixed);
+ stream.setf(stream_type::hex | stream_type::scientific | stream_type::fixed);
break;
case conversion::character:
case conversion::string:
@@ -1012,10 +1012,12 @@ public:
// NON-POLYMORPHIC ARGUMENT WRAPPER
//**************************************************************************
-template <typename Stream>
+template <typename Character, typename Traits = std::char_traits<Character> >
class format_argument
{
public:
+ using stream_type = std::basic_ostream<Character, Traits>;
+
format_argument()
: m_value(nullptr)
, m_output_function(nullptr)
@@ -1033,18 +1035,18 @@ public:
{
}
- void output(Stream &str, format_flags const &flags) const { m_output_function(str, flags, m_value); }
+ void output(stream_type &str, format_flags const &flags) const { m_output_function(str, flags, m_value); }
bool make_integer(int &result) const { return m_make_integer_function(m_value, result); }
void store_integer(std::streamoff data) const { m_store_integer_function(m_value, data); }
private:
- typedef void (*output_function)(Stream &str, format_flags const &flags, void const *value);
+ typedef void (*output_function)(stream_type &str, format_flags const &flags, void const *value);
typedef bool (*make_integer_function)(void const *value, int &result);
typedef void (*store_integer_function)(void const *value, std::streamoff data);
- template <typename T> static void static_output(Stream &str, format_flags const &flags, void const *value)
+ template <typename T> static void static_output(stream_type &str, format_flags const &flags, void const *value)
{
- format_output<Stream, T>::apply(str, flags, *reinterpret_cast<T const *>(value));
+ format_output<stream_type, T>::apply(str, flags, *reinterpret_cast<T const *>(value));
}
template <typename T> static bool static_make_integer(void const *value, int &result)
@@ -1068,11 +1070,12 @@ private:
// NON-POLYMORPHIC ARGUMENT PACK WRAPPER BASE
//**************************************************************************
-template <typename Stream = std::ostream>
+template <typename Character = char, typename Traits = std::char_traits<Character> >
class format_argument_pack
{
public:
- typedef typename Stream::char_type char_type;
+ using stream_type = std::basic_ostream<Character, Traits>;
+ using char_type = Character;
typedef char_type const *iterator;
iterator format_begin() const
{
@@ -1086,7 +1089,7 @@ public:
{
return m_argument_count;
}
- format_argument<Stream> const &operator[](std::size_t index) const
+ format_argument<char_type, Traits> const &operator[](std::size_t index) const
{
assert(m_argument_count > index);
return m_arguments[index];
@@ -1103,7 +1106,7 @@ protected:
template <typename Format>
format_argument_pack(
Format &&fmt,
- format_argument<Stream> const *arguments,
+ format_argument<char_type, Traits> const *arguments,
std::enable_if_t<handle_char_ptr<std::remove_reference_t<Format> >::value, std::size_t> argument_count)
: m_begin(fmt)
, m_end(nullptr)
@@ -1119,7 +1122,7 @@ protected:
template <typename Format>
format_argument_pack(
Format &&fmt,
- format_argument<Stream> const *arguments,
+ format_argument<char_type, Traits> const *arguments,
std::enable_if_t<handle_char_array<std::remove_reference_t<Format> >::value, std::size_t> argument_count)
: m_begin(std::cbegin(fmt))
, m_end(std::cend(fmt))
@@ -1135,7 +1138,7 @@ protected:
template <typename Format>
format_argument_pack(
Format &&fmt,
- format_argument<Stream> const *arguments,
+ format_argument<char_type, Traits> const *arguments,
std::enable_if_t<handle_container<std::remove_reference_t<Format> >::value, std::size_t> argument_count)
: m_begin(fmt.empty() ? nullptr : &*std::cbegin(fmt))
, m_end(fmt.empty() ? nullptr : (m_begin + std::distance(std::cbegin(fmt), std::cend(fmt))))
@@ -1149,17 +1152,17 @@ protected:
assert(m_arguments || !m_argument_count);
}
- format_argument_pack(format_argument_pack<Stream> const &) = default;
- format_argument_pack(format_argument_pack<Stream> &&) = default;
- format_argument_pack &operator=(format_argument_pack<Stream> const &) = default;
- format_argument_pack &operator=(format_argument_pack<Stream> &&) = default;
+ format_argument_pack(format_argument_pack<char_type, Traits> const &) = default;
+ format_argument_pack(format_argument_pack<char_type, Traits> &&) = default;
+ format_argument_pack &operator=(format_argument_pack<char_type, Traits> const &) = default;
+ format_argument_pack &operator=(format_argument_pack<char_type, Traits> &&) = default;
private:
- iterator m_begin;
- iterator m_end;
- bool m_check_nul;
- format_argument<Stream> const *m_arguments;
- std::size_t m_argument_count;
+ iterator m_begin;
+ iterator m_end;
+ bool m_check_nul;
+ format_argument<char_type, Traits> const *m_arguments;
+ std::size_t m_argument_count;
};
@@ -1167,27 +1170,27 @@ private:
// ARGUMENT PACK WRAPPER IMPLEMENTATION
//**************************************************************************
-template <typename Stream, std::size_t Count>
+template <typename Character, typename Traits, std::size_t Count>
class format_argument_pack_impl
- : private std::array<format_argument<Stream>, Count>
- , public format_argument_pack<Stream>
+ : private std::array<format_argument<Character, Traits>, Count>
+ , public format_argument_pack<Character, Traits>
{
public:
- using typename format_argument_pack<Stream>::iterator;
- using format_argument_pack<Stream>::operator[];
+ using typename format_argument_pack<Character, Traits>::iterator;
+ using format_argument_pack<Character, Traits>::operator[];
template <typename Format, typename... Params>
format_argument_pack_impl(Format &&fmt, Params &&... args)
- : std::array<format_argument<Stream>, Count>({ { format_argument<Stream>(std::forward<Params>(args))... } })
- , format_argument_pack<Stream>(std::forward<Format>(fmt), Count ? &*this->cbegin() : nullptr, Count)
+ : std::array<format_argument<Character, Traits>, Count>({ { format_argument<Character, Traits>(std::forward<Params>(args))... } })
+ , format_argument_pack<Character, Traits>(std::forward<Format>(fmt), Count ? &*this->cbegin() : nullptr, Count)
{
static_assert(sizeof...(Params) == Count, "Wrong number of constructor arguments");
}
- format_argument_pack_impl(format_argument_pack_impl<Stream, Count> const &) = default;
- format_argument_pack_impl(format_argument_pack_impl<Stream, Count> &&) = default;
- format_argument_pack_impl &operator=(format_argument_pack_impl<Stream, Count> const &) = default;
- format_argument_pack_impl &operator=(format_argument_pack_impl<Stream, Count> &&) = default;
+ format_argument_pack_impl(format_argument_pack_impl<Character, Traits, Count> const &) = default;
+ format_argument_pack_impl(format_argument_pack_impl<Character, Traits, Count> &&) = default;
+ format_argument_pack_impl &operator=(format_argument_pack_impl<Character, Traits, Count> const &) = default;
+ format_argument_pack_impl &operator=(format_argument_pack_impl<Character, Traits, Count> &&) = default;
};
@@ -1196,9 +1199,9 @@ public:
//**************************************************************************
template <typename Stream = std::ostream, typename Format, typename... Params>
-inline format_argument_pack_impl<Stream, sizeof...(Params)> make_format_argument_pack(Format &&fmt, Params &&... args)
+inline auto make_format_argument_pack(Format &&fmt, Params &&... args)
{
- return format_argument_pack_impl<Stream, sizeof...(Params)>(std::forward<Format>(fmt), std::forward<Params>(args)...);
+ return format_argument_pack_impl<typename Stream::char_type, typename Stream::traits_type, sizeof...(Params)>(std::forward<Format>(fmt), std::forward<Params>(args)...);
}
@@ -1546,15 +1549,16 @@ private:
// CORE FORMATTING FUNCTION
//**************************************************************************
-template <typename Stream, typename Base>
-typename Stream::off_type stream_format(Stream &str, format_argument_pack<Base> const &args)
+template <typename Character, typename Traits = std::char_traits<Character> >
+typename std::basic_ostream<Character, Traits>::off_type stream_format(std::basic_ostream<Character, Traits> &str, format_argument_pack<Character, Traits> const &args)
{
- typedef format_helper<format_argument_pack<Base> > format_helper;
- typedef typename format_argument_pack<Base>::iterator iterator;
+ using stream_type = std::basic_ostream<Character, Traits>;
+ using format_helper = format_helper<format_argument_pack<Character, Traits> >;
+ using iterator = typename format_argument_pack<Character, Traits>::iterator;
class stream_preserver
{
public:
- stream_preserver(Stream &stream)
+ stream_preserver(stream_type &stream)
: m_stream(stream)
, m_fill(stream.fill())
, m_flags(stream.flags())
@@ -1570,14 +1574,14 @@ typename Stream::off_type stream_format(Stream &str, format_argument_pack<Base>
m_stream.fill(m_fill);
}
private:
- Stream &m_stream;
- typename Stream::char_type m_fill;
- typename Stream::fmtflags m_flags;
- std::streamsize m_precision;
- std::streamsize m_width;
+ stream_type &m_stream;
+ typename stream_type::char_type m_fill;
+ typename stream_type::fmtflags m_flags;
+ std::streamsize m_precision;
+ std::streamsize m_width;
};
- typename Stream::pos_type const begin(str.tellp());
+ typename stream_type::pos_type const begin(str.tellp());
stream_preserver const preserver(str);
int next_pos(1);
iterator start = args.format_begin();
@@ -1650,7 +1654,7 @@ typename Stream::off_type stream_format(Stream &str, format_argument_pack<Base>
}
else if (format_flags::conversion::percent == flags.get_conversion())
{
- str << typename Stream::char_type(format_chars<typename Stream::char_type>::percent);
+ str << Character(format_chars<Character>::percent);
start = it;
}
else
@@ -1661,10 +1665,10 @@ typename Stream::off_type stream_format(Stream &str, format_argument_pack<Base>
continue;
if (format_flags::conversion::tell == flags.get_conversion())
{
- typename Stream::pos_type const current(str.tellp());
+ typename stream_type::pos_type const current(str.tellp());
args[arg_pos - 1].store_integer(
- ((typename Stream::pos_type(-1) == begin) || (typename Stream::pos_type(-1) == current))
- ? typename Stream::off_type(-1)
+ ((typename stream_type::pos_type(-1) == begin) || (typename stream_type::pos_type(-1) == current))
+ ? typename stream_type::off_type(-1)
: (current - begin));
}
else
@@ -1675,9 +1679,9 @@ typename Stream::off_type stream_format(Stream &str, format_argument_pack<Base>
}
}
}
- typename Stream::pos_type const end(str.tellp());
- return ((typename Stream::pos_type(-1) == begin) || (typename Stream::pos_type(-1) == end))
- ? typename Stream::off_type(-1)
+ typename stream_type::pos_type const end(str.tellp());
+ return ((typename stream_type::pos_type(-1) == begin) || (typename stream_type::pos_type(-1) == end))
+ ? typename stream_type::off_type(-1)
: (end - begin);
}
@@ -1694,14 +1698,14 @@ inline typename Stream::off_type stream_format(Stream &str, Format const &fmt, P
return detail::stream_format(str, detail::make_format_argument_pack<Stream>(fmt, std::forward<Params>(args)...));
}
-template <typename Stream, typename Base>
-inline typename Stream::off_type stream_format(Stream &str, detail::format_argument_pack<Base> const &args)
+template <typename Stream, typename Character, typename Traits>
+inline typename Stream::off_type stream_format(Stream &str, detail::format_argument_pack<Character, Traits> const &args)
{
return detail::stream_format(str, args);
}
-template <typename Stream, typename Base>
-inline typename Stream::off_type stream_format(Stream &str, detail::format_argument_pack<Base> &&args)
+template <typename Stream, typename Character, typename Traits>
+inline typename Stream::off_type stream_format(Stream &str, detail::format_argument_pack<Character, Traits> &&args)
{
return detail::stream_format(str, args);
}
@@ -1714,7 +1718,7 @@ inline typename Stream::off_type stream_format(Stream &str, detail::format_argum
template <typename String = std::string, typename Format, typename... Params>
inline String string_format(Format &&fmt, Params &&... args)
{
- typedef std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type> ostream;
+ using ostream = std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type>;
ostream str;
stream_format(str, fmt, std::forward<Params>(args)...);
return str.str();
@@ -1723,45 +1727,45 @@ inline String string_format(Format &&fmt, Params &&... args)
template <typename String = std::string, typename Format, typename... Params>
inline String string_format(std::locale const &locale, Format &&fmt, Params &&... args)
{
- typedef std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type> ostream;
+ using ostream = std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type>;
ostream str;
str.imbue(locale);
stream_format(str, fmt, std::forward<Params>(args)...);
return str.str();
};
-template <typename String = std::string, typename Stream>
-inline String string_format(detail::format_argument_pack<Stream> const &args)
+template <typename String = std::string>
+inline String string_format(detail::format_argument_pack<typename String::value_type, typename String::traits_type> const &args)
{
- typedef std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type> ostream;
+ using ostream = std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type>;
ostream str;
detail::stream_format(str, args);
return str.str();
};
-template <typename String = std::string, typename Stream>
-inline String string_format(detail::format_argument_pack<Stream> &&args)
+template <typename String = std::string>
+inline String string_format(detail::format_argument_pack<typename String::value_type, typename String::traits_type> &&args)
{
- typedef std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type> ostream;
+ using ostream = std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type>;
ostream str;
detail::stream_format(str, std::move(args));
return str.str();
};
-template <typename String = std::string, typename Stream>
-inline String string_format(std::locale const &locale, detail::format_argument_pack<Stream> const &args)
+template <typename String = std::string>
+inline String string_format(std::locale const &locale, detail::format_argument_pack<typename String::value_type, typename String::traits_type> const &args)
{
- typedef std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type> ostream;
+ using ostream = std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type>;
ostream str;
str.imbue(locale);
detail::stream_format(str, args);
return str.str();
};
-template <typename String = std::string, typename Stream>
-inline String string_format(std::locale const &locale, detail::format_argument_pack<Stream> &&args)
+template <typename String = std::string>
+inline String string_format(std::locale const &locale, detail::format_argument_pack<typename String::value_type, typename String::traits_type> &&args)
{
- typedef std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type> ostream;
+ using ostream = std::basic_ostringstream<typename String::value_type, typename String::traits_type, typename String::allocator_type>;
ostream str;
str.imbue(locale);
detail::stream_format(str, std::move(args));
@@ -1792,641 +1796,128 @@ extern template class format_chars<wchar_t>;
extern template void format_flags::apply(std::ostream &) const;
extern template void format_flags::apply(std::wostream &) const;
-extern template void format_flags::apply(std::iostream &) const;
-extern template void format_flags::apply(std::wiostream &) const;
-extern template void format_flags::apply(std::ostringstream &) const;
-extern template void format_flags::apply(std::wostringstream &) const;
-extern template void format_flags::apply(std::stringstream &) const;
-extern template void format_flags::apply(std::wstringstream &) const;
-extern template void format_flags::apply(ovectorstream &) const;
-extern template void format_flags::apply(wovectorstream &) const;
-extern template void format_flags::apply(vectorstream &) const;
-extern template void format_flags::apply(wvectorstream &) const;
-
-extern template class format_argument<std::ostream>;
-extern template void format_argument<std::ostream>::static_output<char>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<signed char>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<unsigned char>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<short>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<unsigned short>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<int>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<unsigned int>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<long>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<unsigned long>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<long long>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<unsigned long long>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<char *>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<char const *>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<std::string>(std::ostream &, format_flags const &, void const *);
-extern template void format_argument<std::ostream>::static_output<std::string_view>(std::ostream &, format_flags const &, void const *);
-extern template bool format_argument<std::ostream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<char *>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<char const *>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<std::string>(void const *, int &);
-extern template bool format_argument<std::ostream>::static_make_integer<std::string_view>(void const *, int &);
-extern template void format_argument<std::ostream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<char *>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<char const *>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<std::string>(void const *, std::streamoff);
-extern template void format_argument<std::ostream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-extern template class format_argument<std::wostream>;
-extern template void format_argument<std::wostream>::static_output<char>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<signed char>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<unsigned char>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<wchar_t>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<short>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<unsigned short>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<int>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<unsigned int>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<long>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<unsigned long>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<long long>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<unsigned long long>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<wchar_t *>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<wchar_t const *>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<std::wstring>(std::wostream &, format_flags const &, void const *);
-extern template void format_argument<std::wostream>::static_output<std::wstring_view>(std::wostream &, format_flags const &, void const *);
-extern template bool format_argument<std::wostream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<wchar_t>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<wchar_t *>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<wchar_t const *>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<std::wstring>(void const *, int &);
-extern template bool format_argument<std::wostream>::static_make_integer<std::wstring_view>(void const *, int &);
-extern template void format_argument<std::wostream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-extern template void format_argument<std::wostream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-extern template class format_argument<std::iostream>;
-extern template void format_argument<std::iostream>::static_output<char>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<signed char>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<unsigned char>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<short>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<unsigned short>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<int>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<unsigned int>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<long>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<unsigned long>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<long long>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<unsigned long long>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<char *>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<char const *>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<std::string>(std::iostream &, format_flags const &, void const *);
-extern template void format_argument<std::iostream>::static_output<std::string_view>(std::iostream &, format_flags const &, void const *);
-extern template bool format_argument<std::iostream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<char *>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<char const *>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<std::string>(void const *, int &);
-extern template bool format_argument<std::iostream>::static_make_integer<std::string_view>(void const *, int &);
-extern template void format_argument<std::iostream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<char *>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<char const *>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<std::string>(void const *, std::streamoff);
-extern template void format_argument<std::iostream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-extern template class format_argument<std::wiostream>;
-extern template void format_argument<std::wiostream>::static_output<char>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<signed char>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<unsigned char>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<wchar_t>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<short>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<unsigned short>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<int>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<unsigned int>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<long>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<unsigned long>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<long long>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<unsigned long long>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<wchar_t *>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<wchar_t const *>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<std::wstring>(std::wiostream &, format_flags const &, void const *);
-extern template void format_argument<std::wiostream>::static_output<std::wstring_view>(std::wiostream &, format_flags const &, void const *);
-extern template bool format_argument<std::wiostream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<wchar_t>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<wchar_t *>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<wchar_t const *>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<std::wstring>(void const *, int &);
-extern template bool format_argument<std::wiostream>::static_make_integer<std::wstring_view>(void const *, int &);
-extern template void format_argument<std::wiostream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-extern template void format_argument<std::wiostream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-extern template class format_argument<std::ostringstream>;
-extern template void format_argument<std::ostringstream>::static_output<char>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<signed char>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<unsigned char>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<short>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<unsigned short>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<int>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<unsigned int>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<long>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<unsigned long>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<long long>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<unsigned long long>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<char *>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<char const *>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<std::string>(std::ostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::ostringstream>::static_output<std::string_view>(std::ostringstream &, format_flags const &, void const *);
-extern template bool format_argument<std::ostringstream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<char *>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<char const *>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<std::string>(void const *, int &);
-extern template bool format_argument<std::ostringstream>::static_make_integer<std::string_view>(void const *, int &);
-extern template void format_argument<std::ostringstream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<char *>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<char const *>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<std::string>(void const *, std::streamoff);
-extern template void format_argument<std::ostringstream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-extern template class format_argument<std::wostringstream>;
-extern template void format_argument<std::wostringstream>::static_output<char>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<signed char>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<unsigned char>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<wchar_t>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<short>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<unsigned short>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<int>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<unsigned int>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<long>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<unsigned long>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<long long>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<unsigned long long>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<wchar_t *>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<wchar_t const *>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<std::wstring>(std::wostringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wostringstream>::static_output<std::wstring_view>(std::wostringstream &, format_flags const &, void const *);
-extern template bool format_argument<std::wostringstream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<wchar_t>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<wchar_t *>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<wchar_t const *>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<std::wstring>(void const *, int &);
-extern template bool format_argument<std::wostringstream>::static_make_integer<std::wstring_view>(void const *, int &);
-extern template void format_argument<std::wostringstream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-extern template void format_argument<std::wostringstream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-extern template class format_argument<std::stringstream>;
-extern template void format_argument<std::stringstream>::static_output<char>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<signed char>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<unsigned char>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<short>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<unsigned short>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<int>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<unsigned int>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<long>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<unsigned long>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<long long>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<unsigned long long>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<char *>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<char const *>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<std::string>(std::stringstream &, format_flags const &, void const *);
-extern template void format_argument<std::stringstream>::static_output<std::string_view>(std::stringstream &, format_flags const &, void const *);
-extern template bool format_argument<std::stringstream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<char *>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<char const *>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<std::string>(void const *, int &);
-extern template bool format_argument<std::stringstream>::static_make_integer<std::string_view>(void const *, int &);
-extern template void format_argument<std::stringstream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<char *>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<char const *>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<std::string>(void const *, std::streamoff);
-extern template void format_argument<std::stringstream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-extern template class format_argument<std::wstringstream>;
-extern template void format_argument<std::wstringstream>::static_output<char>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<signed char>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<unsigned char>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<wchar_t>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<short>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<unsigned short>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<int>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<unsigned int>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<long>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<unsigned long>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<long long>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<unsigned long long>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<wchar_t *>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<wchar_t const *>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<std::wstring>(std::wstringstream &, format_flags const &, void const *);
-extern template void format_argument<std::wstringstream>::static_output<std::wstring_view>(std::wstringstream &, format_flags const &, void const *);
-extern template bool format_argument<std::wstringstream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<wchar_t>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<wchar_t *>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<wchar_t const *>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<std::wstring>(void const *, int &);
-extern template bool format_argument<std::wstringstream>::static_make_integer<std::wstring_view>(void const *, int &);
-extern template void format_argument<std::wstringstream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-extern template void format_argument<std::wstringstream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-extern template class format_argument<ovectorstream>;
-extern template void format_argument<ovectorstream>::static_output<char>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<signed char>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<unsigned char>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<short>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<unsigned short>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<int>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<unsigned int>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<long>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<unsigned long>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<long long>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<unsigned long long>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<char *>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<char const *>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<std::string>(ovectorstream &, format_flags const &, void const *);
-extern template void format_argument<ovectorstream>::static_output<std::string_view>(ovectorstream &, format_flags const &, void const *);
-extern template bool format_argument<ovectorstream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<char *>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<char const *>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<std::string>(void const *, int &);
-extern template bool format_argument<ovectorstream>::static_make_integer<std::string_view>(void const *, int &);
-extern template void format_argument<ovectorstream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<char *>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<char const *>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<std::string>(void const *, std::streamoff);
-extern template void format_argument<ovectorstream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-extern template class format_argument<wovectorstream>;
-extern template void format_argument<wovectorstream>::static_output<char>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<signed char>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<unsigned char>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<wchar_t>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<short>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<unsigned short>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<int>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<unsigned int>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<long>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<unsigned long>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<long long>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<unsigned long long>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<wchar_t *>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<wchar_t const *>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<std::wstring>(wovectorstream &, format_flags const &, void const *);
-extern template void format_argument<wovectorstream>::static_output<std::wstring_view>(wovectorstream &, format_flags const &, void const *);
-extern template bool format_argument<wovectorstream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<wchar_t>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<wchar_t *>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<wchar_t const *>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<std::wstring>(void const *, int &);
-extern template bool format_argument<wovectorstream>::static_make_integer<std::wstring_view>(void const *, int &);
-extern template void format_argument<wovectorstream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-extern template void format_argument<wovectorstream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-extern template class format_argument<vectorstream>;
-extern template void format_argument<vectorstream>::static_output<char>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<signed char>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<unsigned char>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<short>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<unsigned short>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<int>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<unsigned int>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<long>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<unsigned long>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<long long>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<unsigned long long>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<char *>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<char const *>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<std::string>(vectorstream &, format_flags const &, void const *);
-extern template void format_argument<vectorstream>::static_output<std::string_view>(vectorstream &, format_flags const &, void const *);
-extern template bool format_argument<vectorstream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<char *>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<char const *>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<std::string>(void const *, int &);
-extern template bool format_argument<vectorstream>::static_make_integer<std::string_view>(void const *, int &);
-extern template void format_argument<vectorstream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<char *>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<char const *>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<std::string>(void const *, std::streamoff);
-extern template void format_argument<vectorstream>::static_store_integer<std::string_view>(void const *, std::streamoff);
-
-extern template class format_argument<wvectorstream>;
-extern template void format_argument<wvectorstream>::static_output<char>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<signed char>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<unsigned char>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<wchar_t>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<short>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<unsigned short>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<int>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<unsigned int>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<long>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<unsigned long>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<long long>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<unsigned long long>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<wchar_t *>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<wchar_t const *>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<std::wstring>(wvectorstream &, format_flags const &, void const *);
-extern template void format_argument<wvectorstream>::static_output<std::wstring_view>(wvectorstream &, format_flags const &, void const *);
-extern template bool format_argument<wvectorstream>::static_make_integer<char>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<signed char>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<unsigned char>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<wchar_t>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<short>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<unsigned short>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<int>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<unsigned int>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<long>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<unsigned long>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<long long>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<unsigned long long>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<wchar_t *>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<wchar_t const *>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<std::wstring>(void const *, int &);
-extern template bool format_argument<wvectorstream>::static_make_integer<std::wstring_view>(void const *, int &);
-extern template void format_argument<wvectorstream>::static_store_integer<char>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<signed char>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<unsigned char>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<wchar_t>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<short>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<unsigned short>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<int>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<unsigned int>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<long>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<unsigned long>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<long long>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<unsigned long long>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<wchar_t *>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<std::wstring>(void const *, std::streamoff);
-extern template void format_argument<wvectorstream>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
-
-extern template class format_argument_pack<std::ostream>;
-extern template class format_argument_pack<std::wostream>;
-extern template class format_argument_pack<std::iostream>;
-extern template class format_argument_pack<std::wiostream>;
-extern template class format_argument_pack<std::ostringstream>;
-extern template class format_argument_pack<std::wostringstream>;
-extern template class format_argument_pack<std::stringstream>;
-extern template class format_argument_pack<std::wstringstream>;
-extern template class format_argument_pack<ovectorstream>;
-extern template class format_argument_pack<wovectorstream>;
-extern template class format_argument_pack<vectorstream>;
-extern template class format_argument_pack<wvectorstream>;
-
-extern template std::ostream::off_type stream_format(std::ostream &, format_argument_pack<std::ostream> const &);
-extern template std::wostream::off_type stream_format(std::wostream &, format_argument_pack<std::wostream> const &);
-extern template std::iostream::off_type stream_format(std::iostream &, format_argument_pack<std::ostream> const &);
-extern template std::iostream::off_type stream_format(std::iostream &, format_argument_pack<std::iostream> const &);
-extern template std::wiostream::off_type stream_format(std::wiostream &, format_argument_pack<std::wostream> const &);
-extern template std::wiostream::off_type stream_format(std::wiostream &, format_argument_pack<std::wiostream> const &);
-extern template std::ostringstream::off_type stream_format(std::ostringstream &, format_argument_pack<std::ostream> const &);
-extern template std::ostringstream::off_type stream_format(std::ostringstream &, format_argument_pack<std::ostringstream> const &);
-extern template std::wostringstream::off_type stream_format(std::wostringstream &, format_argument_pack<std::wostream> const &);
-extern template std::wostringstream::off_type stream_format(std::wostringstream &, format_argument_pack<std::wostringstream> const &);
-extern template std::stringstream::off_type stream_format(std::stringstream &, format_argument_pack<std::ostream> const &);
-extern template std::stringstream::off_type stream_format(std::stringstream &, format_argument_pack<std::iostream> const &);
-extern template std::stringstream::off_type stream_format(std::stringstream &, format_argument_pack<std::stringstream> const &);
-extern template std::wstringstream::off_type stream_format(std::wstringstream &, format_argument_pack<std::wostream> const &);
-extern template std::wstringstream::off_type stream_format(std::wstringstream &, format_argument_pack<std::wiostream> const &);
-extern template std::wstringstream::off_type stream_format(std::wstringstream &, format_argument_pack<std::wstringstream> const &);
-extern template ovectorstream::off_type stream_format(ovectorstream &, format_argument_pack<std::ostream> const &);
-extern template ovectorstream::off_type stream_format(ovectorstream &, format_argument_pack<ovectorstream> const &);
-extern template wovectorstream::off_type stream_format(wovectorstream &, format_argument_pack<std::wostream> const &);
-extern template wovectorstream::off_type stream_format(wovectorstream &, format_argument_pack<wovectorstream> const &);
-extern template vectorstream::off_type stream_format(vectorstream &, format_argument_pack<std::ostream> const &);
-extern template vectorstream::off_type stream_format(vectorstream &, format_argument_pack<std::iostream> const &);
-extern template vectorstream::off_type stream_format(vectorstream &, format_argument_pack<vectorstream> const &);
-extern template wvectorstream::off_type stream_format(wvectorstream &, format_argument_pack<std::wostream> const &);
-extern template wvectorstream::off_type stream_format(wvectorstream &, format_argument_pack<std::wiostream> const &);
-extern template wvectorstream::off_type stream_format(wvectorstream &, format_argument_pack<wvectorstream> const &);
+
+extern template class format_argument<char>;
+extern template void format_argument<char>::static_output<bool>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<char>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<signed char>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<unsigned char>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<short>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<unsigned short>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<int>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<unsigned int>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<long>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<unsigned long>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<long long>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<unsigned long long>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<char *>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<char const *>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<std::string>(std::ostream &, format_flags const &, void const *);
+extern template void format_argument<char>::static_output<std::string_view>(std::ostream &, format_flags const &, void const *);
+extern template bool format_argument<char>::static_make_integer<bool>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<char>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<signed char>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<unsigned char>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<short>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<unsigned short>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<int>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<unsigned int>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<long>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<unsigned long>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<long long>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<unsigned long long>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<char *>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<char const *>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<std::string>(void const *, int &);
+extern template bool format_argument<char>::static_make_integer<std::string_view>(void const *, int &);
+extern template void format_argument<char>::static_store_integer<bool>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<char>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<signed char>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<unsigned char>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<short>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<unsigned short>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<int>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<unsigned int>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<long>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<unsigned long>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<long long>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<unsigned long long>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<char *>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<char const *>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<std::string>(void const *, std::streamoff);
+extern template void format_argument<char>::static_store_integer<std::string_view>(void const *, std::streamoff);
+
+extern template class format_argument<wchar_t>;
+extern template void format_argument<wchar_t>::static_output<bool>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<char>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<signed char>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<unsigned char>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<wchar_t>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<short>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<unsigned short>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<int>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<unsigned int>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<long>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<unsigned long>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<long long>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<unsigned long long>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<wchar_t *>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<wchar_t const *>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<std::wstring>(std::wostream &, format_flags const &, void const *);
+extern template void format_argument<wchar_t>::static_output<std::wstring_view>(std::wostream &, format_flags const &, void const *);
+extern template bool format_argument<wchar_t>::static_make_integer<bool>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<char>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<signed char>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<unsigned char>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<wchar_t>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<short>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<unsigned short>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<int>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<unsigned int>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<long>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<unsigned long>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<long long>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<unsigned long long>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<wchar_t *>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<wchar_t const *>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<std::wstring>(void const *, int &);
+extern template bool format_argument<wchar_t>::static_make_integer<std::wstring_view>(void const *, int &);
+extern template void format_argument<wchar_t>::static_store_integer<bool>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<char>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<signed char>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<unsigned char>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<wchar_t>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<short>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<unsigned short>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<int>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<unsigned int>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<long>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<unsigned long>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<long long>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<unsigned long long>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<wchar_t *>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<wchar_t const *>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<std::wstring>(void const *, std::streamoff);
+extern template void format_argument<wchar_t>::static_store_integer<std::wstring_view>(void const *, std::streamoff);
+
+extern template class format_argument_pack<char>;
+extern template class format_argument_pack<wchar_t>;
+
+extern template std::ostream::off_type stream_format(std::ostream &, format_argument_pack<char> const &);
+extern template std::wostream::off_type stream_format(std::wostream &, format_argument_pack<wchar_t> const &);
} // namespace detail
+extern template std::string string_format(format_argument_pack<char> const &);
+extern template std::string string_format(format_argument_pack<char> &&);
+extern template std::string string_format(std::locale const &, format_argument_pack<char> const &);
+extern template std::string string_format(std::locale const &, format_argument_pack<char> &&);
+
+extern template std::wstring string_format(format_argument_pack<wchar_t> const &);
+extern template std::wstring string_format(format_argument_pack<wchar_t> &&);
+extern template std::wstring string_format(std::locale const &, format_argument_pack<wchar_t> const &);
+extern template std::wstring string_format(std::locale const &, format_argument_pack<wchar_t> &&);
+
} // namespace util
#endif // MAME_UTIL_STRFORMAT_H