libpqxx  5.0
binarystring.hxx
1 /*-------------------------------------------------------------------------
2  *
3  * FILE
4  * pqxx/binarystring.hxx
5  *
6  * DESCRIPTION
7  * Representation for raw, binary data.
8  * DO NOT INCLUDE THIS FILE DIRECTLY; include pqxx/binarystring instead.
9  *
10  * Copyright (c) 2003-2015, Jeroen T. Vermeulen <jtv@xs4all.nl>
11  *
12  * See COPYING for copyright license. If you did not receive a file called
13  * COPYING with this source code, please notify the distributor of this mistake,
14  * or contact the author.
15  *
16  *-------------------------------------------------------------------------
17  */
18 #ifndef PQXX_H_BINARYSTRING
19 #define PQXX_H_BINARYSTRING
20 
21 #include "pqxx/compiler-public.hxx"
22 #include "pqxx/compiler-internal-pre.hxx"
23 
24 #include <string>
25 
26 #include "pqxx/result"
27 
28 
29 namespace pqxx
30 {
31 
33 
59 class PQXX_LIBEXPORT binarystring
60 {
61 public:
62  typedef unsigned char char_type;
63  typedef std::char_traits<char_type>::char_type value_type;
64  typedef size_t size_type;
65  typedef long difference_type;
66  typedef const value_type &const_reference;
67  typedef const value_type *const_pointer;
69  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
70 
71 public:
72  binarystring(const binarystring &);
73 
75 
78  explicit binarystring(const field &); //[t62]
79 
81  explicit binarystring(const std::string &);
82 
84  binarystring(const void *, size_t);
85 
86  ~binarystring() { delete &m_buf; }
87 
89  size_type size() const PQXX_NOEXCEPT { return m_size; } //[t62]
91  size_type length() const PQXX_NOEXCEPT { return size(); } //[t62]
92  bool empty() const PQXX_NOEXCEPT { return size()==0; } //[t62]
93 
94  const_iterator begin() const PQXX_NOEXCEPT { return data(); } //[t62]
95  const_iterator cbegin() const PQXX_NOEXCEPT { return begin(); }
96  const_iterator end() const PQXX_NOEXCEPT { return data()+m_size; } //[t62]
97  const_iterator cend() const PQXX_NOEXCEPT { return end(); }
98 
99  const_reference front() const PQXX_NOEXCEPT { return *begin(); } //[t62]
100  const_reference back() const PQXX_NOEXCEPT //[t62]
101  { return *(data()+m_size-1); }
102 
104  { return const_reverse_iterator(end()); }
105  const_reverse_iterator crbegin() const { return rbegin(); }
106  const_reverse_iterator rend() const //[t62]
107  { return const_reverse_iterator(begin()); }
108  const_reverse_iterator crend() const { return rend(); }
109 
111  const value_type *data() const PQXX_NOEXCEPT {return m_buf.get();} //[t62]
112 
113  const_reference operator[](size_type i) const PQXX_NOEXCEPT //[t62]
114  { return data()[i]; }
115 
116  PQXX_PURE bool operator==(const binarystring &) const PQXX_NOEXCEPT; //[t62]
117  bool operator!=(const binarystring &rhs) const PQXX_NOEXCEPT //[t62]
118  { return !operator==(rhs); }
119 
120  binarystring &operator=(const binarystring &);
121 
123  const_reference at(size_type) const; //[t62]
124 
126  void swap(binarystring &); //[t62]
127 
129 
132  const char *get() const PQXX_NOEXCEPT //[t62]
133  { return reinterpret_cast<const char *>(m_buf.get()); }
134 
136 
142  std::string str() const; //[t62]
143 
144 private:
145  typedef internal::PQAlloc<
146  value_type,
147  pqxx::internal::freemallocmem_templated<unsigned char> >
148  smart_pointer_type;
149 
150  /* Using a reference to a smart pointer. It's wasteful, but it hides the
151  * different implementations of PQAlloc: the compiler needs to know PQAlloc's
152  * memory layout in order to include an instance inside binarystring.
153  * Once shared_ptr is widespread enough, we can just have a shared_ptr and
154  * forget about PQAlloc altogether.
155  */
156  smart_pointer_type &m_buf;
157  size_type m_size;
158 };
159 }
160 
161 #include "pqxx/compiler-internal-post.hxx"
162 
163 #endif
bool empty() const PQXX_NOEXCEPT
Definition: binarystring.hxx:92
const_reference back() const PQXX_NOEXCEPT
Definition: binarystring.hxx:100
const_reverse_iterator rbegin() const
Definition: binarystring.hxx:103
Reference to a field in a result set.
Definition: field.hxx:51
const value_type * const_pointer
Definition: binarystring.hxx:67
const_reverse_iterator crend() const
Definition: binarystring.hxx:108
const value_type * data() const PQXX_NOEXCEPT
Unescaped field contents.
Definition: binarystring.hxx:111
const_reference operator[](size_type i) const PQXX_NOEXCEPT
Definition: binarystring.hxx:113
Definition: binarystring.hxx:59
const_reverse_iterator rend() const
Definition: binarystring.hxx:106
const_iterator cend() const PQXX_NOEXCEPT
Definition: binarystring.hxx:97
const_reverse_iterator crbegin() const
Definition: binarystring.hxx:105
const_iterator begin() const PQXX_NOEXCEPT
Definition: binarystring.hxx:94
const_iterator cbegin() const PQXX_NOEXCEPT
Definition: binarystring.hxx:95
size_type length() const PQXX_NOEXCEPT
Size of converted string in bytes.
Definition: binarystring.hxx:91
const_iterator end() const PQXX_NOEXCEPT
Definition: binarystring.hxx:96
size_t size_type
Definition: binarystring.hxx:64
std::char_traits< char_type >::char_type value_type
Definition: binarystring.hxx:63
const_reference front() const PQXX_NOEXCEPT
Definition: binarystring.hxx:99
size_type size() const PQXX_NOEXCEPT
Size of converted string in bytes.
Definition: binarystring.hxx:89
long difference_type
Definition: binarystring.hxx:65
unsigned char char_type
Definition: binarystring.hxx:62
const value_type & const_reference
Definition: binarystring.hxx:66
~binarystring()
Definition: binarystring.hxx:86
const_pointer const_iterator
Definition: binarystring.hxx:68
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: binarystring.hxx:69
Reference-counted smart pointer to libpq-allocated object.
Definition: util.hxx:551