2012-04-29 20:52:25 +02:00
|
|
|
//
|
|
|
|
// Buffer.h
|
|
|
|
//
|
|
|
|
// Library: Foundation
|
|
|
|
// Package: Core
|
|
|
|
// Module: Buffer
|
|
|
|
//
|
|
|
|
// Definition of the Buffer class.
|
|
|
|
//
|
2012-05-13 19:00:42 +02:00
|
|
|
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
2012-04-29 20:52:25 +02:00
|
|
|
// and Contributors.
|
|
|
|
//
|
2014-05-04 21:02:42 +02:00
|
|
|
// SPDX-License-Identifier: BSL-1.0
|
2012-04-29 20:52:25 +02:00
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef Foundation_Buffer_INCLUDED
|
|
|
|
#define Foundation_Buffer_INCLUDED
|
|
|
|
|
|
|
|
|
|
|
|
#include "Poco/Foundation.h"
|
2012-06-08 04:24:36 +02:00
|
|
|
#include "Poco/Exception.h"
|
2012-05-12 23:01:05 +02:00
|
|
|
#include <cstring>
|
2012-05-13 17:34:20 +02:00
|
|
|
#include <cstddef>
|
2012-04-29 20:52:25 +02:00
|
|
|
|
|
|
|
|
|
|
|
namespace Poco {
|
|
|
|
|
|
|
|
|
|
|
|
template <class T>
|
|
|
|
class Buffer
|
2012-12-12 03:27:32 +01:00
|
|
|
/// A buffer class that allocates a buffer of a given type and size
|
|
|
|
/// in the constructor and deallocates the buffer in the destructor.
|
2012-05-13 17:34:20 +02:00
|
|
|
///
|
|
|
|
/// This class is useful everywhere where a temporary buffer
|
|
|
|
/// is needed.
|
2012-04-29 20:52:25 +02:00
|
|
|
{
|
|
|
|
public:
|
2015-11-30 15:49:07 +01:00
|
|
|
Buffer(std::size_t length):
|
|
|
|
_capacity(length),
|
|
|
|
_used(length),
|
2014-10-09 10:34:46 +02:00
|
|
|
_ptr(0),
|
2012-06-07 05:59:13 +02:00
|
|
|
_ownMem(true)
|
2012-05-13 17:34:20 +02:00
|
|
|
/// Creates and allocates the Buffer.
|
|
|
|
{
|
2015-11-30 15:49:07 +01:00
|
|
|
if (length > 0)
|
2014-10-09 10:34:46 +02:00
|
|
|
{
|
2015-11-30 15:49:07 +01:00
|
|
|
_ptr = new T[length];
|
2014-10-09 10:34:46 +02:00
|
|
|
}
|
2012-05-13 17:34:20 +02:00
|
|
|
}
|
2012-05-13 19:00:42 +02:00
|
|
|
|
2014-09-10 16:44:36 +02:00
|
|
|
Buffer(T* pMem, std::size_t length):
|
2012-06-07 05:59:13 +02:00
|
|
|
_capacity(length),
|
|
|
|
_used(length),
|
|
|
|
_ptr(pMem),
|
|
|
|
_ownMem(false)
|
|
|
|
/// Creates the Buffer. Length argument specifies the length
|
|
|
|
/// of the supplied memory pointed to by pMem in the number
|
|
|
|
/// of elements of type T. Supplied pointer is considered
|
|
|
|
/// blank and not owned by Buffer, so in this case Buffer
|
|
|
|
/// only acts as a wrapper around externally supplied
|
|
|
|
/// (and lifetime-managed) memory.
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-09-10 16:44:36 +02:00
|
|
|
Buffer(const T* pMem, std::size_t length):
|
2012-06-07 05:59:13 +02:00
|
|
|
_capacity(length),
|
|
|
|
_used(length),
|
2014-10-09 10:34:46 +02:00
|
|
|
_ptr(0),
|
2012-06-07 05:59:13 +02:00
|
|
|
_ownMem(true)
|
|
|
|
/// Creates and allocates the Buffer; copies the contents of
|
|
|
|
/// the supplied memory into the buffer. Length argument specifies
|
|
|
|
/// the length of the supplied memory pointed to by pMem in the
|
|
|
|
/// number of elements of type T.
|
|
|
|
{
|
2014-10-09 10:34:46 +02:00
|
|
|
if (_capacity > 0)
|
|
|
|
{
|
|
|
|
_ptr = new T[_capacity];
|
2012-06-07 05:59:13 +02:00
|
|
|
std::memcpy(_ptr, pMem, _used * sizeof(T));
|
2014-10-09 10:34:46 +02:00
|
|
|
}
|
2012-06-07 05:59:13 +02:00
|
|
|
}
|
|
|
|
|
2012-05-13 19:00:42 +02:00
|
|
|
Buffer(const Buffer& other):
|
|
|
|
/// Copy constructor.
|
|
|
|
_capacity(other._used),
|
|
|
|
_used(other._used),
|
2014-10-09 10:34:46 +02:00
|
|
|
_ptr(0),
|
2012-06-07 05:59:13 +02:00
|
|
|
_ownMem(true)
|
2012-05-13 19:00:42 +02:00
|
|
|
{
|
|
|
|
if (_used)
|
2014-10-09 10:34:46 +02:00
|
|
|
{
|
|
|
|
_ptr = new T[_used];
|
2012-05-13 19:00:42 +02:00
|
|
|
std::memcpy(_ptr, other._ptr, _used * sizeof(T));
|
2014-10-09 10:34:46 +02:00
|
|
|
}
|
2012-05-13 19:00:42 +02:00
|
|
|
}
|
|
|
|
|
2014-09-10 16:44:36 +02:00
|
|
|
Buffer& operator = (const Buffer& other)
|
2012-05-13 19:00:42 +02:00
|
|
|
/// Assignment operator.
|
|
|
|
{
|
|
|
|
if (this != &other)
|
|
|
|
{
|
|
|
|
Buffer tmp(other);
|
|
|
|
swap(tmp);
|
|
|
|
}
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
C++11 support #1793 (#1795)
* * C++14 detection
* C++14 RWLock (disabled: std::shared_timed_mutex has separate read and write unlock)
* * C++11 Event - disable because
std::condition_variable nas no built-in concept of reset
std::condition_variable may be unblocked spuriously, must handle?
* * Fix std::condition_variable handling
* * C++11 semaphore
* * Use Semaphore max paramater
* * Implement manual reset Event and re-enable
* Disable std semaphore, C++ doesn't have native semaphore, better to use native ones for now
* * C++11 Thread (in progress)
* * Fix auto reset event
* * std::*mutex with timeout doesn't guarantee that the timeout will be respected
* Thread in unix has special member for signal handling
* * Workaround for AppleClang lack of thread_local
* * C++11 format
* * C++11 Logger
* * Fix Poco::format
* * std::function event delegate
* * Fix StdFunctionDelegate for GCC
* * C++11 move semantics
* * Fix format test
* * Add cpp11_changes files
* * Auto detect compiler C++11/14 support
* Option to force disable C++11/14
* * GCC/Clang need to enable C++11/14 support via command line switches
* * Fixes for VS2013 C++11 support
* * Makefile C++11/14 compiler detection (in progress)
* * Simple GCC version detection
* AppleClang version detection
* Fix gcc c++11 build script
Update c++11 status document
* Use predefined constant instead of --version
* Fix CC & CXX to gcc 4.8 for all matrix rows.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Restore apt-get update -qq
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Display g++ version and full g++ command line
* Fix typo
* Use command line/environment variables for CC & CXX
* Display GCCVERSION
* Use $(CXX) for setting GCCVERSION
* Do not use <cstdint>, otherwise NumberFormatter wo'nt compile
* restore silent mode on make
* Use predefined constants __clang_major__ and __clang_minor__
* Reverse clang++ options
* Add c++11/14 detection
* -std=c++14 is not valid for clang 3.4
* Run tests for both gcc 4.6 & gcc 4.8
* Restore Apple clang setup
* Align setup of std=c++11 from CLANGVERSION with check of clang version in Platform_POSIX.h
On Linux ubuntu at Travis, clang 3.4 does not support std=c++14
* Add OSX run with clang
* Add forgetted Linux guard on install
* Display clang's predefined constants on OSX
* Comment out Apple temporarly
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* export CC & CXX for OSX
* Test when clang is from Apple
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Remove typo
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Align test with comment
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Add Cygwin-clang
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Install CppUnit for running the unit tests on OSX.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Looking for libCppUnit.1.dylib
* Install libCppUnit*.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Exclude Redis for OSX. To be restored later on.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Remove some display lines
* Reenable tests
* Add run tests on cmake build with ctest -VV
* Split runtests.sh into ignored.sh and excluded.sh. ignored.sh will be
used for excluding tests from ctest.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Add ignored.sh to exclude CPPUNIT_IGNORE test on ctest
* Set proper path
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Exclude Data* from CTest. Run tests on ARM
* Add POCO_BASE for tests using test files under $POCO_BASE/component/testsuite
* Replace MB by KB otherwise Travis & AppVeyor are timing out.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Specialize runtests.sh & excluded.sh according to OSX or Linux
* Split OSX/Linux runtests.sh
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Removed invalid comment
* Make runtests.sh executable
* c++11 atomic<> default constructor is never initialized
* Initialize to 0 in any case.
* Comment out set -ev for now
* Comment out set -ev for now
* reset verbose mode
* reset verbose mode
* catch SIGPIPE as returnfrom testrunner to avoid failure in networking tests
* Use source for export ignored tests to avoid the permission denied problem
* chmod 775
* Apply patches from @RangeIReale
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Add cpp11-appleclang
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Initialize AtomicCounter to 0 since the c++11 default constructor don't
do it.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* avoid SIGPIPE on send
* fix WbeSocketServer
* Remove SIGPIPE workaround
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Fix WebSocketServer
* Restore set -ev
* Restore set -ev
* Fix WebSocketServer responding loop
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Cleanup the exit test.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Add important comment.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Copy also cpp11-* so that mkrelease works!
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Avoid PocoDoc preprocessisng error.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* * Sync script and Platform_POSIX.h compiler versions
* VS2013 & VS2015 fixups.
Signed-off-by: Francis ANDRE <zosrothko@orange.fr>
* Backport to c++03 so that Travis and Appveyor be ok
Signed-off-by: Francis ANDRE <zosrothko@orange.fr>
* Add Copyright (c) 2016, Applied Informatics Software Engineering GmbH.
and Contributors.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* VS2013 fixup
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Backport to c++03
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* VS2013 fixup
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Backport to c++03
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* VS2013 fixup
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* BAckport c++03
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* OSX: clang++ rejects return (*static_cast<Derived*>(this));
cannot cast protected base class 'cpp_ex4::StoplightContext<cpp_ex4::Stoplight>' to 'cpp_ex4::Stoplight'
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* BAckport to c++03
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Add generated file for now
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* deleted as source file name in lowercase.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Rename stoplight_sm.h to Stoplight_sm.h
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Rename stoplight_sm.h to Stoplight_sm.h
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Rename stoplight_sm.h to Stoplight_sm.h
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Put cmake and ctest on the DOS PATH
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Cygwin does not support timed_mutex
* Put installed CMake /CTest on the DOS PATH.
* Repackaging
* Build VS2013 & VS2014 first.
* Add std::string Foundation_API format(const std::string& fmt, const Any& value);
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Restore INLINES macros when compiling with c++03
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Rename stoplight_sm.h to Stoplight_sm.h
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* VS2013 fixup.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Baclport to c++03
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* cpp_ex4::StoplightContext<cpp_ex4::Stoplight> is an inaccessible base of ˜cpp_ex4::Stoplight
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Undef _XOPEN_SOURCE under Cygwin otherwise ulong is undefined.
usr/include/mysql/my_global.h:997:9: error: 'ulong' does not name a type
typedef ulong nesting_map; /* Used for flags of nesting constructs */
^
In file included from src/SQLExecutor.cpp:38:0:
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Fix merge failure. Set -ev option on shell.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Removed
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Undefine _XOPEN_SOURCE so that typedef unsigned long ulong be defined.
Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
* Remove __*VISIBLE defines as GNU forbids their usage outside the system includes
Signed-off-by: Francis ANDRE <zosrothko@orange.fr>
* Use c++03 as last c++ version.
Signed-off-by: Francis ANDRE <zosrothko@orange.fr>
* MySQL needs ulong which are not visible when compiling with
c++11 and above.
Signed-off-by: Francis ANDRE <zosrothko@orange.fr>
* Add BUILD_CC=gcc to avoid strip issue
* Remove reference to FSM
* make ?= operator does not work with
* Remove BUILD_CC
* Remove FSM since it is now in its own branch
* Don't build Cygwin64 with std=c++14 until this issue be fixed https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77441
* enable c++11
* remove changes tracking file (moved to project)
* C++11: fixes for Travis CI (#1798)
* Use c++11 compliant compiler: g++ 5 & clang 3.5.0
* Fix typo on IntType
* Use Linux-clang config instead of Linux
* Check arm-linux-gnueabi-g++ version. Dump compiler constants
* Fix missing namespace qualifier
* Ignore ltdl for Cygwin platform
* Fix typo
* Commented out arm-linux-gnueabi-g++ since the version 4.7.0 which does
not support c++11 standard.
* Restore logic as in develop branch
* Add CXXFLAGS for launching the CXX compilation. CXXFLAGS defaulted to
-std=c++11
* Replace auto_ptr by unique_ptr
* Comment out failing tests until be fixed
* C++11: Fix AppVeyor CI yaml (#1812)
* C++11 support #1793: It's time. g++4.9, clang3.3 and VS2015 will become
minimum compiler versions.
* Comment out image with VS2017 since it crashes.
* New release of OpenSSL: 1_1_0f
* Refactor the download steps of OpenSSL
* C++11 support: Add VS2017 Win32 & x64 (#1816)
* Add VS2017.
* Use VSSetup to get VS150COMNTOOLS
* Fix VS150COMNTOOLS value
* Ignore Install-Module
* Install VSSetUp PS module.
* Fix typo missing $
* Split InstallPath againt "="
* Adjust VS150COMMONTOOLS path.
* Exit failed is VS commontools is undefined.
* Get the InstalledPath property value
* Replace mysql-5.7.17 by mysql-5.7.18
* Replace mysql-5.7.17 by mysql-5.7.18
* c++11 thread priority and affinity, and more (#1811)
* * c++11 thread priority and affinity
* AtomicCounter wasn't using std::atomic
* Buffer wasn't setting all fields on move
* Poco::Event is not directly available in c++11, keep using the native versions
* UnWindows.h define NOMINMAX to reduce conflicts
* Remove "-static" from Linux GCC parameters, this conflicts with c++11 classes (https://stackoverflow.com/questions/7090623/c0x-thread-static-linking-problem)
* Link "-lrt" before "-lpthread" on Linux, otherwise won't build on GCC 5+
* * Fixed std::thread POSIX handle
* * Fix OSX compilation
* raise cmake min version to 3.2.0
* Remove CMake jobs since it is already tested on Travis (#1832)
* Remove CMake jobs since it is already tested on Travis
* Add clang-3.7
* Ubuntu Trusty LLVM repo for gettign clang versions.
* Remove 3.3 & 3.4
* Add clang 3.8, clang 3.9 & clang 4.0
* Add CXXFLAGS=-stdlib=libc++
* use libstdc++ instead of libc++
* Remove for now -g compiler option to avoid this spurious error on clang
error: debug information for auto is not yet supported
* Use -ftemplate-backtrace-limit=0 to dump the recursive template stack.
* Cleanup
* Use good gcc version
* Fix gcc-5 & g++-5 name
* Use libc++ instead of libstdc++
* Restore installation of gcc-5
* Readd agt-get update for gcc-5/g++-5
* Reswitch from libc++ to libstdc++
* Increase template evaluation stack size up to 340 to avoid a stack
overflow in parsing
TupleType t = std::make_tuple(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14...
* Add clang 3.4, 3.5, 3.6
* Adjust template evaluation stack for clang 3.4, 3.5, 3.6, 3.7
* Update notifications
* Add gcc-4.9
* Backport Travis CXXFLAGS to config/Linux-clang
* Remove CXXFLAGS from clang tests
* Test g++ first, then clang++ and then arm
* remove all non-c++11 code and POCO_ENABLE_CPP11 (default now)
* remove old file
* windows c++11 fixes
* fix conversion warning
* C++11: Use Mutex_POSIX for Cygwin since it does not support std::timed_mutex (#1864)
* Use Mutex_POSIX for Cygwin since it does not support std::timed_mutex
* Use Mutex_POSIX for Cygwin since it does not support std::timed_mutex
* Add Mutext_POSIX.cpp
* Json/parser (#1858)
* move parser implementation in separate file
* parser replacement, first attempt (wip)
* making tests pass (mostly done, 3 to go)
* add missing headers
* honor no-null-byte-in-string setting
* few more fixes
* add -std=c99
* fix cmake JSON build and formatting
* accept utf-8, fix tests
* skip calling isdigit()
* #740, #1860, license update, a warning fix
* var emtpy()->clear(); json array and object tidy up
* vs 2015 32-bit project update
* update VS2017 projects
* remove ProGen and all VS files older than 2015
* fixed GH #1865: AbstractEvent::hasDelegates() is not thread-safe
* merge develop
* add missing files
* add VS generated dir to gitignore
* add WEC2013.cmake
* fix exception message
* fix VS2017 ODBC project filter
* integrate PageCompiler changes from poco-1.7.9
* vs2015 openssl build
* added POCO_DEPRECATED macro
* added POCO_NO_DEPRECATED to disarm POCO_DEPRECATED macro
* PageCompiler: support <%@ include file="<path>" %> syntax for includes.
* remove '$Id$' headers
* remove '$Id$' headers
* remove old VMS and VxWorks build support
* Poco::NamedMutex and Poco::NamedEvent (System V Semaphores implementation): files are now opened with O_RDONLY | O_CREAT instead of O_WRONLY | O_CREAT, allowing sharing between different users. Furthermore, ftok() is called with 'p' as project ID argument.
* C++11 (#1887)
* Use Mutex_POSIX for Cygwin since it does not support std::timed_mutex
* Use Mutex_POSIX for Cygwin since it does not support std::timed_mutex
* Add Mutext_POSIX.cpp
* Remove clang 3.4, 3.5, 3.6, 3.7, 3.8, 3.9 since LLVM does not provide
anymore their packages for Ubuntu Trusy
* Remove ubuntu-toolchain-r/test/ubuntu since it is already installed
* Comment our the llvl-toolchain-trusty since its checksum is buggy
See https://bugs.llvm.org/show_bug.cgi?id=34572
* Display g++ version (#1889)
* merge change from develop|
* Support for PKCS#12 (#1876)
* rebuild openssl binaries; warning and stlye fixes
* fix vs2015 projects and openssl linking
* add PKCS12Container
* remove comments
* style
* add ECKey* and CryptoException
* EC key, unify RSA and EC under same inheritance, add constructor from PKCS12, couple of EC key tests
* simplify EVPPKey, ad EC tests
* EVPPKey test and fixes
* fix linux build
* PKCS12 tests and fixes
* linux build, fix crash
* fix leaks
* uncomment ifstream tests, some minor fixes
* fix stream tests and some tidy-up
* remove $Id
* add ECDSA
* update makefile
* align PKCS12 constructors signatures with X509
* EVPPKey EC curve name constructor
* ECDSA fixes and tests
* linux build, wrap tests in try/catch to get full exception message
* style
* update VS projects
* remove openssl, modify VS projects for git submodule directories
* add openssl submodule
* add _CRT_SECURE_NO_WARNINGS
* port crypto dev fixes from 1.8
* lock whole Event:set()
* fix openssl include path
* Add <memory> for std::unique_ptr (#1891)
* Missing include <iostream> (#1893)
* add file/stream load/save capabilities to EVPPKey
* add EVPTest
* add #include <typeinfo>
* fix posix compile
* update samples VS projects
* fix g++ test compile error
2017-09-21 05:13:19 +02:00
|
|
|
Buffer(Buffer&& other) :
|
|
|
|
/// Copy constructor.
|
|
|
|
_capacity(other._capacity),
|
|
|
|
_used(other._used),
|
|
|
|
_ptr(other._ptr),
|
|
|
|
_ownMem(other._ownMem)
|
|
|
|
{
|
|
|
|
other._capacity = 0;
|
|
|
|
other._used = 0;
|
|
|
|
other._ownMem = false;
|
|
|
|
other._ptr = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
Buffer& operator =(Buffer&& other)
|
|
|
|
/// Assignment operator.
|
|
|
|
{
|
|
|
|
if (this != &other)
|
|
|
|
{
|
|
|
|
_capacity = other._capacity;
|
|
|
|
_used = other._used;
|
|
|
|
_ptr = other._ptr;
|
|
|
|
_ownMem = other._ownMem;
|
|
|
|
|
|
|
|
other._capacity = 0;
|
|
|
|
other._used = 0;
|
|
|
|
other._ownMem = false;
|
|
|
|
other._ptr = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2012-05-13 17:34:20 +02:00
|
|
|
~Buffer()
|
|
|
|
/// Destroys the Buffer.
|
|
|
|
{
|
2012-06-07 05:59:13 +02:00
|
|
|
if (_ownMem) delete [] _ptr;
|
2012-05-13 17:34:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void resize(std::size_t newCapacity, bool preserveContent = true)
|
2012-08-04 05:49:51 +02:00
|
|
|
/// Resizes the buffer capacity and size. If preserveContent is true,
|
2012-05-13 17:34:20 +02:00
|
|
|
/// the content of the old buffer is copied over to the
|
|
|
|
/// new buffer. The new capacity can be larger or smaller than
|
2012-08-04 05:49:51 +02:00
|
|
|
/// the current one; if it is smaller, capacity will remain intact.
|
|
|
|
/// Size will always be set to the new capacity.
|
|
|
|
///
|
2012-06-07 05:59:13 +02:00
|
|
|
/// Buffers only wrapping externally owned storage can not be
|
|
|
|
/// resized. If resize is attempted on those, IllegalAccessException
|
|
|
|
/// is thrown.
|
2012-05-13 17:34:20 +02:00
|
|
|
{
|
2014-10-09 10:34:46 +02:00
|
|
|
if (!_ownMem) throw Poco::InvalidAccessException("Cannot resize buffer which does not own its storage.");
|
2012-06-07 05:59:13 +02:00
|
|
|
|
2012-05-13 17:34:20 +02:00
|
|
|
if (newCapacity > _capacity)
|
|
|
|
{
|
|
|
|
T* ptr = new T[newCapacity];
|
|
|
|
if (preserveContent)
|
2014-10-09 10:34:46 +02:00
|
|
|
{
|
2014-05-01 05:41:05 +02:00
|
|
|
std::memcpy(ptr, _ptr, _used * sizeof(T));
|
2014-10-09 10:34:46 +02:00
|
|
|
}
|
2012-05-13 17:34:20 +02:00
|
|
|
delete [] _ptr;
|
2012-12-23 09:36:01 +01:00
|
|
|
_ptr = ptr;
|
2012-05-13 17:34:20 +02:00
|
|
|
_capacity = newCapacity;
|
|
|
|
}
|
|
|
|
|
|
|
|
_used = newCapacity;
|
|
|
|
}
|
2013-07-22 05:18:56 +02:00
|
|
|
|
|
|
|
void setCapacity(std::size_t newCapacity, bool preserveContent = true)
|
|
|
|
/// Sets the buffer capacity. If preserveContent is true,
|
|
|
|
/// the content of the old buffer is copied over to the
|
|
|
|
/// new buffer. The new capacity can be larger or smaller than
|
|
|
|
/// the current one; size will be set to the new capacity only if
|
|
|
|
/// new capacity is smaller than the current size, otherwise it will
|
|
|
|
/// remain intact.
|
|
|
|
///
|
|
|
|
/// Buffers only wrapping externally owned storage can not be
|
|
|
|
/// resized. If resize is attempted on those, IllegalAccessException
|
|
|
|
/// is thrown.
|
|
|
|
{
|
2014-10-09 10:34:46 +02:00
|
|
|
if (!_ownMem) throw Poco::InvalidAccessException("Cannot resize buffer which does not own its storage.");
|
2013-07-22 05:18:56 +02:00
|
|
|
|
|
|
|
if (newCapacity != _capacity)
|
|
|
|
{
|
2014-10-09 10:34:46 +02:00
|
|
|
T* ptr = 0;
|
|
|
|
if (newCapacity > 0)
|
2014-05-01 05:41:05 +02:00
|
|
|
{
|
2014-10-09 10:34:46 +02:00
|
|
|
ptr = new T[newCapacity];
|
|
|
|
if (preserveContent)
|
|
|
|
{
|
|
|
|
std::size_t newSz = _used < newCapacity ? _used : newCapacity;
|
|
|
|
std::memcpy(ptr, _ptr, newSz * sizeof(T));
|
|
|
|
}
|
2014-05-01 05:41:05 +02:00
|
|
|
}
|
2013-07-22 05:18:56 +02:00
|
|
|
delete [] _ptr;
|
|
|
|
_ptr = ptr;
|
|
|
|
_capacity = newCapacity;
|
|
|
|
|
|
|
|
if (newCapacity < _used) _used = newCapacity;
|
|
|
|
}
|
|
|
|
}
|
2012-05-13 17:34:20 +02:00
|
|
|
|
2012-06-07 05:59:13 +02:00
|
|
|
void assign(const T* buf, std::size_t sz)
|
|
|
|
/// Assigns the argument buffer to this buffer.
|
|
|
|
/// If necessary, resizes the buffer.
|
|
|
|
{
|
|
|
|
if (0 == sz) return;
|
|
|
|
if (sz > _capacity) resize(sz, false);
|
2014-05-01 05:41:05 +02:00
|
|
|
std::memcpy(_ptr, buf, sz * sizeof(T));
|
2012-06-07 05:59:13 +02:00
|
|
|
_used = sz;
|
|
|
|
}
|
|
|
|
|
2012-05-13 19:23:57 +02:00
|
|
|
void append(const T* buf, std::size_t sz)
|
|
|
|
/// Resizes this buffer and appends the argument buffer.
|
|
|
|
{
|
2012-06-07 05:59:13 +02:00
|
|
|
if (0 == sz) return;
|
2012-05-13 19:23:57 +02:00
|
|
|
resize(_used + sz, true);
|
2014-05-01 05:41:05 +02:00
|
|
|
std::memcpy(_ptr + _used - sz, buf, sz * sizeof(T));
|
2013-06-16 03:28:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void append(T val)
|
|
|
|
/// Resizes this buffer by one element and appends the argument value.
|
|
|
|
{
|
|
|
|
resize(_used + 1, true);
|
|
|
|
_ptr[_used - 1] = val;
|
2012-05-13 19:23:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void append(const Buffer& buf)
|
|
|
|
/// Resizes this buffer and appends the argument buffer.
|
|
|
|
{
|
|
|
|
append(buf.begin(), buf.size());
|
|
|
|
}
|
|
|
|
|
2012-05-13 17:34:20 +02:00
|
|
|
std::size_t capacity() const
|
2012-12-15 20:47:22 +01:00
|
|
|
/// Returns the allocated memory size in elements.
|
2012-05-13 17:34:20 +02:00
|
|
|
{
|
|
|
|
return _capacity;
|
|
|
|
}
|
|
|
|
|
2012-12-15 20:47:22 +01:00
|
|
|
std::size_t capacityBytes() const
|
|
|
|
/// Returns the allocated memory size in bytes.
|
|
|
|
{
|
|
|
|
return _capacity * sizeof(T);
|
|
|
|
}
|
|
|
|
|
2012-05-13 19:00:42 +02:00
|
|
|
void swap(Buffer& other)
|
|
|
|
/// Swaps the buffer with another one.
|
|
|
|
{
|
|
|
|
using std::swap;
|
|
|
|
|
|
|
|
swap(_ptr, other._ptr);
|
|
|
|
swap(_capacity, other._capacity);
|
|
|
|
swap(_used, other._used);
|
|
|
|
}
|
|
|
|
|
2014-10-09 10:34:46 +02:00
|
|
|
bool operator == (const Buffer& other) const
|
2012-05-13 19:00:42 +02:00
|
|
|
/// Compare operator.
|
|
|
|
{
|
|
|
|
if (this != &other)
|
|
|
|
{
|
|
|
|
if (_used == other._used)
|
|
|
|
{
|
2014-05-01 05:41:05 +02:00
|
|
|
if (std::memcmp(_ptr, other._ptr, _used * sizeof(T)) == 0)
|
2012-05-13 19:00:42 +02:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-10-09 10:34:46 +02:00
|
|
|
bool operator != (const Buffer& other) const
|
2012-05-13 19:00:42 +02:00
|
|
|
/// Compare operator.
|
|
|
|
{
|
|
|
|
return !(*this == other);
|
|
|
|
}
|
|
|
|
|
|
|
|
void clear()
|
2014-10-09 10:34:46 +02:00
|
|
|
/// Sets the contents of the buffer to zero.
|
2012-05-13 19:00:42 +02:00
|
|
|
{
|
|
|
|
std::memset(_ptr, 0, _used * sizeof(T));
|
|
|
|
}
|
|
|
|
|
2012-05-13 17:34:20 +02:00
|
|
|
std::size_t size() const
|
2012-12-15 20:47:22 +01:00
|
|
|
/// Returns the used size of the buffer in elements.
|
2012-05-13 17:34:20 +02:00
|
|
|
{
|
|
|
|
return _used;
|
|
|
|
}
|
2012-12-15 20:47:22 +01:00
|
|
|
|
|
|
|
std::size_t sizeBytes() const
|
|
|
|
/// Returns the used size of the buffer in bytes.
|
|
|
|
{
|
|
|
|
return _used * sizeof(T);
|
|
|
|
}
|
2012-05-13 17:34:20 +02:00
|
|
|
|
|
|
|
T* begin()
|
|
|
|
/// Returns a pointer to the beginning of the buffer.
|
2012-04-29 20:52:25 +02:00
|
|
|
{
|
|
|
|
return _ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
const T* begin() const
|
|
|
|
/// Returns a pointer to the beginning of the buffer.
|
|
|
|
{
|
|
|
|
return _ptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
T* end()
|
|
|
|
/// Returns a pointer to end of the buffer.
|
|
|
|
{
|
2012-05-13 17:34:20 +02:00
|
|
|
return _ptr + _used;
|
2012-04-29 20:52:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const T* end() const
|
|
|
|
/// Returns a pointer to the end of the buffer.
|
|
|
|
{
|
2012-05-13 17:34:20 +02:00
|
|
|
return _ptr + _used;
|
|
|
|
}
|
|
|
|
|
2012-05-13 19:00:42 +02:00
|
|
|
bool empty() const
|
|
|
|
/// Return true if buffer is empty.
|
|
|
|
{
|
|
|
|
return 0 == _used;
|
|
|
|
}
|
|
|
|
|
2012-05-13 17:34:20 +02:00
|
|
|
T& operator [] (std::size_t index)
|
|
|
|
{
|
|
|
|
poco_assert (index < _used);
|
2012-04-29 20:52:25 +02:00
|
|
|
|
|
|
|
return _ptr[index];
|
|
|
|
}
|
|
|
|
|
|
|
|
const T& operator [] (std::size_t index) const
|
|
|
|
{
|
2012-05-13 17:34:20 +02:00
|
|
|
poco_assert (index < _used);
|
2012-04-29 20:52:25 +02:00
|
|
|
|
|
|
|
return _ptr[index];
|
2012-05-13 17:34:20 +02:00
|
|
|
}
|
2012-04-29 20:52:25 +02:00
|
|
|
|
|
|
|
private:
|
2012-05-13 17:34:20 +02:00
|
|
|
Buffer();
|
2012-04-29 20:52:25 +02:00
|
|
|
|
2012-05-13 17:34:20 +02:00
|
|
|
std::size_t _capacity;
|
|
|
|
std::size_t _used;
|
|
|
|
T* _ptr;
|
2012-06-07 05:59:13 +02:00
|
|
|
bool _ownMem;
|
2012-04-29 20:52:25 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace Poco
|
|
|
|
|
|
|
|
|
|
|
|
#endif // Foundation_Buffer_INCLUDED
|