blob: c883e3654db7a11815392066fa4da445f2e7ab41 [file] [log] [blame]
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#ifndef DATASTAX_INTERNAL_STRING_HPP
#define DATASTAX_INTERNAL_STRING_HPP
#include "allocator.hpp"
#include "driver_config.hpp"
#include "hash.hpp"
#include <sparsehash/dense_hash_map>
#include <sstream>
#include <string>
namespace datastax {
typedef std::basic_string<char, std::char_traits<char>, internal::Allocator<char> > String;
namespace internal {
class OStringStream : public std::basic_ostream<char, std::char_traits<char> > {
public:
typedef char char_type;
typedef std::char_traits<char> traits_type;
typedef traits_type::int_type int_type;
typedef traits_type::pos_type pos_type;
typedef traits_type::off_type off_type;
typedef internal::Allocator<char> allocator_type;
typedef std::basic_string<char_type, traits_type, allocator_type> string_type;
public:
explicit OStringStream(std::ios_base::openmode mode = ios_base::out)
: std::basic_ostream<char_type, traits_type>(&sb_)
, sb_(mode | ios_base::out) {}
explicit OStringStream(const string_type& str, std::ios_base::openmode mode = ios_base::out)
: std::basic_ostream<char_type, traits_type>(&sb_)
, sb_(str, mode | std::ios_base::out) {}
std::basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {
return const_cast<std::basic_stringbuf<char_type, traits_type, allocator_type>*>(&sb_);
}
string_type str() const { return sb_.str(); }
void str(const string_type& str) { sb_.str(str); }
private:
std::basic_stringbuf<char, std::char_traits<char>, internal::Allocator<char> > sb_;
};
class IStringStream : public std::basic_istream<char, std::char_traits<char> > {
public:
typedef char char_type;
typedef std::char_traits<char> traits_type;
typedef traits_type::int_type int_type;
typedef traits_type::pos_type pos_type;
typedef traits_type::off_type off_type;
typedef internal::Allocator<char> allocator_type;
typedef std::basic_string<char_type, traits_type, allocator_type> string_type;
public:
explicit IStringStream(std::ios_base::openmode mode = ios_base::in)
: std::basic_istream<char_type, traits_type>(&sb_)
, sb_(mode | ios_base::in) {}
explicit IStringStream(const string_type& str, std::ios_base::openmode mode = ios_base::in)
: std::basic_istream<char_type, traits_type>(&sb_)
, sb_(str, mode | std::ios_base::in) {}
std::basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const {
return const_cast<std::basic_stringbuf<char_type, traits_type, allocator_type>*>(&sb_);
}
string_type str() const { return sb_.str(); }
void str(const string_type& str) { sb_.str(str); }
private:
std::basic_stringbuf<char, std::char_traits<char>, internal::Allocator<char> > sb_;
};
} // namespace internal
} // namespace datastax
namespace std {
#if defined(HASH_IN_TR1) && !defined(_WIN32)
namespace tr1 {
#endif
template <>
struct hash<datastax::String> {
size_t operator()(const datastax::String& str) const {
return datastax::hash::fnv1a(str.data(), str.size());
}
};
#if defined(HASH_IN_TR1) && !defined(_WIN32)
} // namespace tr1
#endif
} // namespace std
#endif