00001
00002
00003
00004
00005
00006
00007 #ifndef SAGA_SAGA_BUFFER_HPP
00008 #define SAGA_SAGA_BUFFER_HPP
00009
00010 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
00011 # pragma once
00012 #endif
00013
00014 #include <saga/saga/util.hpp>
00015 #include <saga/saga/base.hpp>
00016 #include <saga/saga/types.hpp>
00017 #include <saga/saga/object.hpp>
00018
00019
00020 #if defined(BOOST_MSVC)
00021 #pragma warning(push)
00022 #pragma warning(disable: 4251 4231 4660)
00023 #endif
00024
00026 namespace saga
00027 {
00037 class SAGA_EXPORT const_buffer
00038 : public saga::object
00039 {
00040 protected:
00042
00043 TR1::shared_ptr <saga::impl::const_buffer> get_impl (void) const;
00044 friend class saga::impl::const_buffer;
00045
00046 const_buffer(saga::impl::const_buffer* impl);
00048
00049 public:
00057 const_buffer(void const* data, saga::ssize_t size);
00058
00063 ~const_buffer();
00064
00070 saga::ssize_t get_size() const;
00071
00077 void const* get_data() const;
00078
00084 void close(double timeout = 0.0);
00085 };
00086
00091 class SAGA_EXPORT mutable_buffer
00092 : public const_buffer
00093 {
00094 protected:
00096
00097 TR1::shared_ptr <saga::impl::buffer> get_impl (void) const;
00098 friend class saga::impl::buffer;
00099
00100 mutable_buffer(saga::impl::buffer* impl);
00102
00103 public:
00105
00106 typedef void buffer_deleter_type(void* data);
00107 typedef TR1::function<buffer_deleter_type> buffer_deleter;
00108
00109
00110 static void default_buffer_deleter(void* data);
00112
00113 public:
00118 mutable_buffer(saga::ssize_t size = -1);
00119
00124 mutable_buffer(void* data, saga::ssize_t size);
00125
00130 mutable_buffer(void* data, saga::ssize_t size, buffer_deleter cb);
00131
00136 ~mutable_buffer();
00137
00142 void set_size(saga::ssize_t size = -1);
00143
00148 void set_data(void* data, saga::ssize_t size,
00149 buffer_deleter cb = default_buffer_deleter);
00150
00155 void* get_data();
00156 };
00157
00159 inline mutable_buffer
00160 buffer(void* data, saga::size_t size)
00161 {
00162 return mutable_buffer(data, size);
00163 }
00164
00165 inline const_buffer
00166 buffer(void const* data, saga::size_t size)
00167 {
00168 return const_buffer(data, size);
00169 }
00170
00172 template <typename PodType, std::size_t N>
00173 inline mutable_buffer
00174 buffer(PodType (&data)[N])
00175 {
00176 return mutable_buffer(data, N * sizeof(PodType));
00177 }
00178
00179 template <typename PodType, std::size_t N>
00180 inline const_buffer
00181 buffer(PodType const (&data)[N])
00182 {
00183 return const_buffer(data, N * sizeof(PodType));
00184 }
00185
00187 template <typename PodType, std::size_t N>
00188 inline mutable_buffer
00189 buffer(PodType (&data)[N], saga::size_t max_size)
00190 {
00191 return mutable_buffer(data,
00192 N * sizeof(PodType) < max_size ? N * sizeof(PodType) : max_size);
00193 }
00194
00195 template <typename PodType, std::size_t N>
00196 inline const_buffer
00197 buffer(PodType const (&data)[N], saga::size_t max_size)
00198 {
00199 return const_buffer(data,
00200 N < max_size ? N * sizeof(PodType) : max_size * sizeof(PodType));
00201 }
00202
00204 template <typename PodType, typename Allocator>
00205 inline mutable_buffer
00206 buffer(std::vector<PodType, Allocator>& data)
00207 {
00208 return mutable_buffer(&data[0], data.size() * sizeof(PodType));
00209 }
00210
00211 template <typename PodType, typename Allocator>
00212 inline const_buffer
00213 buffer(std::vector<PodType, Allocator> const& data)
00214 {
00215 return const_buffer(&data[0], data.size() * sizeof(PodType));
00216 }
00217
00219 template <typename PodType, typename Allocator>
00220 inline mutable_buffer
00221 buffer(std::vector<PodType, Allocator>& data, saga::size_t max_size)
00222 {
00223 return mutable_buffer(&data[0],
00224 data.size() < max_size ?
00225 data.size() * sizeof(PodType) : max_size * sizeof(PodType));
00226 }
00227
00228 template <typename PodType, typename Allocator>
00229 inline const_buffer
00230 buffer(std::vector<PodType, Allocator> const& data, saga::size_t max_size)
00231 {
00232 return const_buffer(&data[0],
00233 data.size() < max_size ?
00234 data.size() * sizeof(PodType) : max_size * sizeof(PodType));
00235 }
00236
00238 template <typename Char, typename Traits, typename Allocator>
00239 inline const_buffer
00240 buffer(std::basic_string<Char, Traits, Allocator> const& data)
00241 {
00242 return const_buffer(data.data(), data.size());
00243 }
00244
00245 template <typename Char, typename Traits, typename Allocator>
00246 inline const_buffer
00247 buffer(std::basic_string<Char, Traits, Allocator> const& data,
00248 saga::size_t max_size)
00249 {
00250 return const_buffer(data.data(), data.size() < max_size ?
00251 data.size() * sizeof(Char) : max_size * sizeof(Char));
00252 }
00253
00254 }
00255
00256
00257 #if defined(BOOST_MSVC)
00258 #pragma warning(pop)
00259 #endif
00260
00261 #endif // SAGA_SAGA_BUFFER_HPP