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