83 lines
1.9 KiB
C
83 lines
1.9 KiB
C
|
/*
|
||
|
Formatting library for C++ - standard container utilities
|
||
|
|
||
|
Copyright (c) 2012 - 2016, Victor Zverovich
|
||
|
All rights reserved.
|
||
|
|
||
|
For the license information refer to format.h.
|
||
|
*/
|
||
|
|
||
|
#ifndef FMT_CONTAINER_H_
|
||
|
#define FMT_CONTAINER_H_
|
||
|
|
||
|
#include "format.h"
|
||
|
|
||
|
namespace fmt {
|
||
|
|
||
|
namespace internal {
|
||
|
|
||
|
/**
|
||
|
\rst
|
||
|
A "buffer" that appends data to a standard container (e.g. typically a
|
||
|
``std::vector`` or ``std::basic_string``).
|
||
|
\endrst
|
||
|
*/
|
||
|
template <typename Container>
|
||
|
class ContainerBuffer : public Buffer<typename Container::value_type> {
|
||
|
private:
|
||
|
Container& container_;
|
||
|
|
||
|
protected:
|
||
|
virtual void grow(std::size_t size) FMT_OVERRIDE {
|
||
|
container_.resize(size);
|
||
|
this->ptr_ = &container_[0];
|
||
|
this->capacity_ = size;
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
explicit ContainerBuffer(Container& container) : container_(container) {
|
||
|
this->size_ = container_.size();
|
||
|
if (this->size_ > 0) {
|
||
|
this->ptr_ = &container_[0];
|
||
|
this->capacity_ = this->size_;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
} // namespace internal
|
||
|
|
||
|
/**
|
||
|
\rst
|
||
|
This class template provides operations for formatting and appending data
|
||
|
to a standard *container* like ``std::vector`` or ``std::basic_string``.
|
||
|
|
||
|
**Example**::
|
||
|
|
||
|
void vecformat(std::vector<char>& dest, fmt::BasicCStringRef<char> format,
|
||
|
fmt::ArgList args) {
|
||
|
fmt::BasicContainerWriter<std::vector<char> > appender(dest);
|
||
|
appender.write(format, args);
|
||
|
}
|
||
|
FMT_VARIADIC(void, vecformat, std::vector<char>&,
|
||
|
fmt::BasicCStringRef<char>);
|
||
|
\endrst
|
||
|
*/
|
||
|
template <class Container>
|
||
|
class BasicContainerWriter
|
||
|
: public BasicWriter<typename Container::value_type> {
|
||
|
private:
|
||
|
internal::ContainerBuffer<Container> buffer_;
|
||
|
|
||
|
public:
|
||
|
/**
|
||
|
\rst
|
||
|
Constructs a :class:`fmt::BasicContainerWriter` object.
|
||
|
\endrst
|
||
|
*/
|
||
|
explicit BasicContainerWriter(Container& dest)
|
||
|
: BasicWriter<typename Container::value_type>(buffer_), buffer_(dest) {}
|
||
|
};
|
||
|
|
||
|
} // namespace fmt
|
||
|
|
||
|
#endif // FMT_CONTAINER_H_
|