a9f62a15cd
git-subtree-dir: externals/fmt git-subtree-split: 398343897f98b88ade80bbebdcbe82a36c65a980
126 lines
3 KiB
C++
126 lines
3 KiB
C++
/*
|
|
Formatting library for C++ - string utilities
|
|
|
|
Copyright (c) 2012 - 2016, Victor Zverovich
|
|
All rights reserved.
|
|
|
|
For the license information refer to format.h.
|
|
*/
|
|
|
|
#ifndef FMT_STRING_H_
|
|
#define FMT_STRING_H_
|
|
|
|
#include "format.h"
|
|
|
|
namespace fmt {
|
|
|
|
namespace internal {
|
|
|
|
// A buffer that stores data in ``std::basic_string``.
|
|
template <typename Char, typename Allocator = std::allocator<Char> >
|
|
class StringBuffer : public Buffer<Char> {
|
|
public:
|
|
typedef std::basic_string<Char, std::char_traits<Char>, Allocator> StringType;
|
|
|
|
private:
|
|
StringType data_;
|
|
|
|
protected:
|
|
virtual void grow(std::size_t size) FMT_OVERRIDE {
|
|
data_.resize(size);
|
|
this->ptr_ = &data_[0];
|
|
this->capacity_ = size;
|
|
}
|
|
|
|
public:
|
|
explicit StringBuffer(const Allocator &allocator = Allocator())
|
|
: data_(allocator) {}
|
|
|
|
// Moves the data to ``str`` clearing the buffer.
|
|
void move_to(StringType &str) {
|
|
data_.resize(this->size_);
|
|
str.swap(data_);
|
|
this->capacity_ = this->size_ = 0;
|
|
this->ptr_ = FMT_NULL;
|
|
}
|
|
};
|
|
} // namespace internal
|
|
|
|
/**
|
|
\rst
|
|
This class template provides operations for formatting and writing data
|
|
into a character stream. The output is stored in a ``std::basic_string``
|
|
that grows dynamically.
|
|
|
|
You can use one of the following typedefs for common character types
|
|
and the standard allocator:
|
|
|
|
+---------------+----------------------------+
|
|
| Type | Definition |
|
|
+===============+============================+
|
|
| StringWriter | BasicStringWriter<char> |
|
|
+---------------+----------------------------+
|
|
| WStringWriter | BasicStringWriter<wchar_t> |
|
|
+---------------+----------------------------+
|
|
|
|
**Example**::
|
|
|
|
StringWriter out;
|
|
out << "The answer is " << 42 << "\n";
|
|
|
|
This will write the following output to the ``out`` object:
|
|
|
|
.. code-block:: none
|
|
|
|
The answer is 42
|
|
|
|
The output can be moved to a ``std::basic_string`` with ``out.move_to()``.
|
|
\endrst
|
|
*/
|
|
template <typename Char, typename Allocator = std::allocator<Char> >
|
|
class BasicStringWriter : public BasicWriter<Char> {
|
|
private:
|
|
internal::StringBuffer<Char, Allocator> buffer_;
|
|
|
|
public:
|
|
/**
|
|
\rst
|
|
Constructs a :class:`fmt::BasicStringWriter` object.
|
|
\endrst
|
|
*/
|
|
explicit BasicStringWriter(const Allocator &allocator = Allocator())
|
|
: BasicWriter<Char>(buffer_), buffer_(allocator) {}
|
|
|
|
/**
|
|
\rst
|
|
Moves the buffer content to *str* clearing the buffer.
|
|
\endrst
|
|
*/
|
|
void move_to(std::basic_string<Char, std::char_traits<Char>, Allocator> &str) {
|
|
buffer_.move_to(str);
|
|
}
|
|
};
|
|
|
|
typedef BasicStringWriter<char> StringWriter;
|
|
typedef BasicStringWriter<wchar_t> WStringWriter;
|
|
|
|
/**
|
|
\rst
|
|
Converts *value* to ``std::string`` using the default format for type *T*.
|
|
|
|
**Example**::
|
|
|
|
#include "fmt/string.h"
|
|
|
|
std::string answer = fmt::to_string(42);
|
|
\endrst
|
|
*/
|
|
template <typename T>
|
|
std::string to_string(const T &value) {
|
|
fmt::MemoryWriter w;
|
|
w << value;
|
|
return w.str();
|
|
}
|
|
}
|
|
|
|
#endif // FMT_STRING_H_
|