Merge ArrayWriter into FixedBuffer
diff --git a/fmt/format.h b/fmt/format.h
index 5b8f5bd..fff6adf 100644
--- a/fmt/format.h
+++ b/fmt/format.h
@@ -586,7 +586,7 @@
 
 /**
   \rst
-  A buffer supporting a subset of ``std::vector``'s operations.
+  A contiguous memory buffer with an optional growing ability.
   \endrst
  */
 template <typename T>
@@ -2843,9 +2843,17 @@
 typedef BasicMemoryWriter<char> MemoryWriter;
 typedef BasicMemoryWriter<wchar_t> WMemoryWriter;
 
-// A fixed-size buffer.
+/**
+  \rst
+  A fixed-size memory buffer. For a dynamically growing buffer use
+  :class:`fmt::internal::MemoryBuffer`.
+
+  Trying to increase the buffer size past the initial capacity will throw
+  ``std::runtime_error``.
+  \endrst
+ */
 template <typename Char>
-class FixedBuffer : public fmt::basic_buffer<Char> {
+class FixedBuffer : public basic_buffer<Char> {
  public:
   /**
    \rst
@@ -2854,54 +2862,20 @@
    \endrst
    */
   FixedBuffer(Char *array, std::size_t size)
-    : fmt::basic_buffer<Char>(array, size) {}
-
- protected:
-  FMT_API void grow(std::size_t size);
-};
-
-/**
-  \rst
-  This class template provides operations for formatting and writing data
-  into a fixed-size array. For writing into a dynamically growing buffer
-  use :class:`fmt::BasicMemoryWriter`.
-
-  Any write method will throw ``std::runtime_error`` if the output doesn't fit
-  into the array.
-
-  You can use one of the following typedefs for common character types:
-
-  +--------------+---------------------------+
-  | Type         | Definition                |
-  +==============+===========================+
-  | ArrayWriter  | BasicArrayWriter<char>    |
-  +--------------+---------------------------+
-  | WArrayWriter | BasicArrayWriter<wchar_t> |
-  +--------------+---------------------------+
-  \endrst
- */
-template <typename Char>
-class BasicArrayWriter : public basic_writer<Char> {
- private:
-  FixedBuffer<Char> buffer_;
-
- public:
-  BasicArrayWriter(Char *array, std::size_t size)
-    : basic_writer<Char>(buffer_), buffer_(array, size) {}
+    : basic_buffer<Char>(array, size) {}
 
   /**
    \rst
-   Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the
+   Constructs a :class:`fmt::FixedBuffer` object for *array* of the
    size known at compile time.
    \endrst
    */
   template <std::size_t SIZE>
-  explicit BasicArrayWriter(Char (&array)[SIZE])
-    : basic_writer<Char>(buffer_), buffer_(array, SIZE) {}
-};
+  explicit FixedBuffer(Char (&array)[SIZE]) : basic_buffer<Char>(array, SIZE) {}
 
-typedef BasicArrayWriter<char> ArrayWriter;
-typedef BasicArrayWriter<wchar_t> WArrayWriter;
+ protected:
+  FMT_API void grow(std::size_t size);
+};
 
 // Reports a system error without throwing an exception.
 // Can be used to report errors from destructors.
diff --git a/test/format-test.cc b/test/format-test.cc
index 02b99fd..56ea713 100644
--- a/test/format-test.cc
+++ b/test/format-test.cc
@@ -474,13 +474,6 @@
   EXPECT_EQ(L"cafe", write_wstr(0xcafe, type='x'));
 }
 
-TEST(ArrayWriterTest, Ctor) {
-  char array[10] = "garbage";
-  fmt::ArrayWriter w(array, sizeof(array));
-  EXPECT_EQ(0u, w.size());
-  EXPECT_STREQ("", w.c_str());
-}
-
 TEST(FormatToTest, FormatWithoutArgs) {
   fmt::internal::MemoryBuffer<char> buffer;
   format_to(buffer, "test");
@@ -498,29 +491,6 @@
   EXPECT_EQ("part1part2", to_string(buffer));
 }
 
-TEST(ArrayWriterTest, CompileTimeSizeCtor) {
-  char array[10] = "garbage";
-  fmt::ArrayWriter w(array);
-  EXPECT_EQ(0u, w.size());
-  EXPECT_STREQ("", w.c_str());
-  format_to(w.buffer(), "{:10}", 1);
-}
-
-TEST(ArrayWriterTest, BufferOverflow) {
-  char array[10];
-  fmt::ArrayWriter w(array, sizeof(array));
-  format_to(w.buffer(), "{:10}", 1);
-  EXPECT_THROW_MSG(format_to(w.buffer(), "{}", 1), std::runtime_error,
-                   "buffer overflow");
-}
-
-TEST(ArrayWriterTest, WChar) {
-  wchar_t array[10];
-  fmt::WArrayWriter w(array);
-  format_to(w.buffer(), L"{}", 42);
-  EXPECT_EQ(L"42", w.str());
-}
-
 TEST(FormatterTest, Escape) {
   EXPECT_EQ("{", format("{{"));
   EXPECT_EQ("before {", format("before {{"));
diff --git a/test/util-test.cc b/test/util-test.cc
index 9466c37..ab14955 100644
--- a/test/util-test.cc
+++ b/test/util-test.cc
@@ -213,19 +213,6 @@
   EXPECT_EQ(20u, buffer.capacity());
 }
 
-TEST(BufferTest, PushBack) {
-  int data[15];
-  MockBuffer<int> buffer(data, 10);
-  buffer.push_back(11);
-  EXPECT_EQ(11, buffer[0]);
-  EXPECT_EQ(1u, buffer.size());
-  buffer.resize(10);
-  EXPECT_CALL(buffer, do_grow(11));
-  buffer.push_back(22);
-  EXPECT_EQ(22, buffer[10]);
-  EXPECT_EQ(11u, buffer.size());
-}
-
 TEST(BufferTest, Append) {
   char data[15];
   MockBuffer<char> buffer(data, 10);
@@ -393,6 +380,29 @@
   EXPECT_CALL(alloc, deallocate(&mem2[0], 2 * size));
 }
 
+TEST(FixedBufferTest, Ctor) {
+  char array[10] = "garbage";
+  fmt::FixedBuffer<char> buffer(array, sizeof(array));
+  EXPECT_EQ(0u, buffer.size());
+  EXPECT_EQ(10u, buffer.capacity());
+  EXPECT_EQ(array, buffer.data());
+}
+
+TEST(FixedBufferTest, CompileTimeSizeCtor) {
+  char array[10] = "garbage";
+  fmt::FixedBuffer<char> buffer(array);
+  EXPECT_EQ(0u, buffer.size());
+  EXPECT_EQ(10u, buffer.capacity());
+  EXPECT_EQ(array, buffer.data());
+}
+
+TEST(FixedBufferTest, BufferOverflow) {
+  char array[10];
+  fmt::FixedBuffer<char> buffer(array);
+  buffer.resize(10);
+  EXPECT_THROW_MSG(buffer.resize(11), std::runtime_error, "buffer overflow");
+}
+
 TEST(UtilTest, Increment) {
   char s[10] = "123";
   increment(s);