53 lines
1.3 KiB
C
53 lines
1.3 KiB
C
|
#ifndef TMP_STRINGVIEW_H
|
||
|
#define TMP_STRINGVIEW_H
|
||
|
|
||
|
/**
|
||
|
* @file tmp/stringview.h"
|
||
|
* @brief partial implementation of C++17 std::string_view
|
||
|
*
|
||
|
* see: https://stackoverflow.com/questions/81870/is-it-possible-to-print-a-variables-type-in-standard-c
|
||
|
* see: https://stackoverflow.com/a/20170989
|
||
|
* string_view is from "static_string" class
|
||
|
* to be replaced by std::string_view as soon as possible
|
||
|
*
|
||
|
* Adapted, minimal C++ version supported now C++11
|
||
|
*/
|
||
|
|
||
|
#include <stdexcept>
|
||
|
|
||
|
namespace tmp {
|
||
|
|
||
|
class string_view {
|
||
|
char const* const _p;
|
||
|
std::size_t const _sz;
|
||
|
|
||
|
public:
|
||
|
using const_iterator = char const*;
|
||
|
|
||
|
template<std::size_t N>
|
||
|
constexpr string_view(char const(&a)[N]) noexcept: _p(a), _sz(N-1) {}
|
||
|
constexpr string_view(char const*p, std::size_t N) noexcept: _p(p), _sz(N) {}
|
||
|
|
||
|
constexpr char const*data() const noexcept {return _p;}
|
||
|
constexpr std::size_t size() const noexcept {return _sz;}
|
||
|
|
||
|
constexpr const_iterator begin() const noexcept {return _p;}
|
||
|
constexpr const_iterator end() const noexcept {return _p + _sz;}
|
||
|
|
||
|
constexpr char operator[](std::size_t n) const {
|
||
|
return n < _sz? _p[n] : throw std::out_of_range("string_view");
|
||
|
}
|
||
|
|
||
|
explicit operator std::string() const { return {_p, _sz}; }
|
||
|
};
|
||
|
|
||
|
template<typename Ostream>
|
||
|
inline Ostream&operator<<(Ostream &os, string_view const&s) {
|
||
|
os.write(s.data(), s.size());
|
||
|
return os;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif
|