1b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich/*
2b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich Formatting library for C++ - string utilities
3b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich
4b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich Copyright (c) 2012 - 2016, Victor Zverovich
5b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich All rights reserved.
6b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich
7b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich For the license information refer to format.h.
8b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich */
9b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich
10b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich#ifndef FMT_STRING_H_
11b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich#define FMT_STRING_H_
12b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich
131500f005250d7b3426f68f35dd1d6fe95542642echronoxor#include "format.h"
14b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich
15b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovichnamespace fmt {
16b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich
17d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovichnamespace internal {
18d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
19db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov// A buffer that stores data in ``std::basic_string``.
20db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebovtemplate <typename Char, typename Allocator = std::allocator<Char> >
21d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovichclass StringBuffer : public Buffer<Char> {
22db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov public:
23db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  typedef std::basic_string<Char, std::char_traits<Char>, Allocator> StringType;
24db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov
25d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich private:
26db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  StringType data_;
27d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
28d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich protected:
2949ccb2e4497ce3d2acae9c0cca81756aa341627dalabuzhev  virtual void grow(std::size_t size) FMT_OVERRIDE {
30d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    data_.resize(size);
31d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    this->ptr_ = &data_[0];
32d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    this->capacity_ = size;
33d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  }
34d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
35d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich public:
36db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  explicit StringBuffer(const Allocator &allocator = Allocator())
37db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  : data_(allocator) {}
38db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov
39d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  // Moves the data to ``str`` clearing the buffer.
40db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  void move_to(StringType &str) {
41d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    data_.resize(this->size_);
42d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    str.swap(data_);
43d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    this->capacity_ = this->size_ = 0;
441daddec15105ce9e91c27dddb38140aee802d9daVictor Zverovich    this->ptr_ = FMT_NULL;
45d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  }
46d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich};
47d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich}  // namespace internal
48d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
49d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich/**
50d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  \rst
51d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  This class template provides operations for formatting and writing data
52db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  into a character stream. The output is stored in a ``std::basic_string``
53db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  that grows dynamically.
54d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
55d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  You can use one of the following typedefs for common character types
56d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  and the standard allocator:
57d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
58d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  +---------------+----------------------------+
59d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  | Type          | Definition                 |
60d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  +===============+============================+
61d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  | StringWriter  | BasicStringWriter<char>    |
62d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  +---------------+----------------------------+
63d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  | WStringWriter | BasicStringWriter<wchar_t> |
64d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  +---------------+----------------------------+
65d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
66d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  **Example**::
67d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
68d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich     StringWriter out;
69d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich     out << "The answer is " << 42 << "\n";
70d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
71d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  This will write the following output to the ``out`` object:
72d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
73d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  .. code-block:: none
74d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
75d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich     The answer is 42
76d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
77db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  The output can be moved to a ``std::basic_string`` with ``out.move_to()``.
78d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  \endrst
79d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich */
80db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebovtemplate <typename Char, typename Allocator = std::allocator<Char> >
81d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovichclass BasicStringWriter : public BasicWriter<Char> {
82d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich private:
83db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  internal::StringBuffer<Char, Allocator> buffer_;
84d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
85d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich public:
86d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  /**
87d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    \rst
88d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    Constructs a :class:`fmt::BasicStringWriter` object.
89d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    \endrst
90d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich   */
91db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  explicit BasicStringWriter(const Allocator &allocator = Allocator())
92db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  : BasicWriter<Char>(buffer_), buffer_(allocator) {}
93d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
94d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  /**
95d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    \rst
96d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    Moves the buffer content to *str* clearing the buffer.
97d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    \endrst
98d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich   */
99db780cb119b604c1998cc91ae73e8c9439c540beAndrey Glebov  void move_to(std::basic_string<Char, std::char_traits<Char>, Allocator> &str) {
100d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich    buffer_.move_to(str);
101d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich  }
102d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich};
103d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
104d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovichtypedef BasicStringWriter<char> StringWriter;
105d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovichtypedef BasicStringWriter<wchar_t> WStringWriter;
106d4885cea62d685db17f2d73819dbfcaff7534aa6Victor Zverovich
107b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich/**
108b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich  \rst
109b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich  Converts *value* to ``std::string`` using the default format for type *T*.
110b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich
111b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich  **Example**::
112b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich
1132d8a7ed0862fa7eb2fdea3b3af71054eca8332c3Victor Zverovich    #include "fmt/string.h"
1142d8a7ed0862fa7eb2fdea3b3af71054eca8332c3Victor Zverovich
115b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich    std::string answer = fmt::to_string(42);
116b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich  \endrst
117b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich */
118b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovichtemplate <typename T>
119b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovichstd::string to_string(const T &value) {
120b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich  fmt::MemoryWriter w;
121b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich  w << value;
122b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich  return w.str();
123b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich}
124b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich}
125b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich
126b6c0cf9683736dffbad7a48016d2b08878102371Victor Zverovich#endif  // FMT_STRING_H_
127