From be933ef2241d79558f91796cc5b3a161f72ebf9c Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 19 Oct 2020 00:52:24 +0200 Subject: sync with upstream --- xbmc/utils/auto_buffer.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 xbmc/utils/auto_buffer.cpp (limited to 'xbmc/utils/auto_buffer.cpp') diff --git a/xbmc/utils/auto_buffer.cpp b/xbmc/utils/auto_buffer.cpp new file mode 100644 index 0000000..e88a960 --- /dev/null +++ b/xbmc/utils/auto_buffer.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2013-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "auto_buffer.h" + +#include // for std::bad_alloc +#include // for malloc(), realloc() and free() + +using namespace XUTILS; + +auto_buffer::auto_buffer(size_t size) +{ + if (!size) + return; + + p = malloc(size); // "malloc()" instead of "new" allow to use "realloc()" + if (!p) + throw std::bad_alloc(); + s = size; +} + +auto_buffer::~auto_buffer() +{ + free(p); +} + +auto_buffer& auto_buffer::allocate(size_t size) +{ + clear(); + if (size) + { + p = malloc(size); + if (!p) + throw std::bad_alloc(); + s = size; + } + return *this; +} + +auto_buffer& auto_buffer::resize(size_t newSize) +{ + if (!newSize) + return clear(); + + void* newPtr = realloc(p, newSize); + if (!newPtr) + throw std::bad_alloc(); + p = newPtr; + s = newSize; + return *this; +} + +auto_buffer& auto_buffer::clear(void) +{ + free(p); + p = 0; + s = 0; + return *this; +} + +auto_buffer& auto_buffer::attach(void* pointer, size_t size) +{ + clear(); + if ((pointer && size) || (!pointer && !size)) + { + p = pointer; + s = size; + } + return *this; +} + +void* auto_buffer::detach(void) +{ + void* returnPtr = p; + p = 0; + s = 0; + return returnPtr; +} + -- cgit v1.2.3