mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-17 15:18:11 +00:00
640f6039ca
Span is roughly modelled on the GSL span<T> type, and is intended to replace direct access to raw pointers -- especially pointers that are passed to functions along with a separate size parameter. It provides low-cost bounds-checked reads and writes, as well as convenience functions for reading common values (integers of varying endianness, strings, etc.). While similar to MemoryReadStream in purpose, Span is superior in cases where memory is writable, where memory is accessed randomly rather than sequentially, or where any invalid access should be treated as an unrecoverable error. It should also be more efficient than a MemoryReadStream because it is implemented using CRTP, so there is no runtime overhead from dynamic dispatch. NamedSpan is an extension of Span which provides enhanced debugging information when out-of-bounds memory accesses occur. It allows programmers to name the memory span at construction time, and it also tracks the offsets of subspans so that the absolute byte offset of the original memory can be provided in the error message if an out-of-bounds access occurs. SpanOwner is similar to ScopedPtr but has awareness of the design of Span objects, so allows the memory pointed to by the Span object inside the SpanOwner to be freed when the SpanOwner is freed without requiring holding a separate pointer to the start of memory. It also provides some copy semantics, so unlike a ScopedPtr, SpanOwners can be held by objects in movable containers like Common::Array -- but note that because there are no move semantics in C++98, this means that a new, complete memory copy of the pointed-to data will be created, rather than just a new Span pointing to the same block of memory, when a container holding a SpanOwner expands.
66 lines
2.2 KiB
C++
66 lines
2.2 KiB
C++
/**
|
|
* Boost Software License - Version 1.0 - August 17th, 2003
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person or organization
|
|
* obtaining a copy of the software and accompanying documentation covered by
|
|
* this license (the "Software") to use, reproduce, display, distribute,
|
|
* execute, and transmit the Software, and to prepare derivative works of the
|
|
* Software, and to permit third-parties to whom the Software is furnished to
|
|
* do so, all subject to the following:
|
|
*
|
|
* The copyright notices in the Software and this entire statement, including
|
|
* the above license grant, this restriction and the following disclaimer,
|
|
* must be included in all copies of the Software, in whole or in part, and
|
|
* all derivative works of the Software, unless such copies or derivative
|
|
* works are solely in the form of machine-executable object code generated by
|
|
* a source language processor.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
|
* SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
|
* FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef COMMON_SAFE_BOOL_H
|
|
#define COMMON_SAFE_BOOL_H
|
|
|
|
namespace Common {
|
|
namespace impl {
|
|
template <typename T>
|
|
struct no_base {};
|
|
|
|
template <typename T>
|
|
struct safe_bool_impl {
|
|
typedef T *TP; // workaround to make parsing easier
|
|
TP stub;
|
|
typedef TP safe_bool_impl::*type;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Prevents `operator bool` from implicitly converting to other types.
|
|
*/
|
|
template <typename DerivedT, typename BaseT = impl::no_base<DerivedT> >
|
|
struct SafeBool : BaseT {
|
|
private:
|
|
typedef impl::safe_bool_impl<DerivedT> impl_t;
|
|
typedef typename impl_t::type bool_type;
|
|
|
|
public:
|
|
operator bool_type() const {
|
|
return static_cast<const DerivedT *>(this)->operator_bool() ?
|
|
&impl_t::stub : 0;
|
|
}
|
|
|
|
operator bool_type() {
|
|
return static_cast<DerivedT *>(this)->operator_bool() ?
|
|
&impl_t::stub : 0;
|
|
}
|
|
};
|
|
} // End of namespace Common
|
|
|
|
#endif
|