diff options
Diffstat (limited to '')
-rw-r--r-- | squirrel_3_0_1_stable/sqrat/sqrat/sqratAllocator.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/squirrel_3_0_1_stable/sqrat/sqrat/sqratAllocator.h b/squirrel_3_0_1_stable/sqrat/sqrat/sqratAllocator.h new file mode 100644 index 000000000..3fa7b707d --- /dev/null +++ b/squirrel_3_0_1_stable/sqrat/sqrat/sqratAllocator.h @@ -0,0 +1,134 @@ +// +// SqratAllocator: Custom Class Allocation/Deallocation +// + +// +// Copyright (c) 2009 Brandon Jones +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// + +#if !defined(_SCRAT_ALLOCATOR_H_) +#define _SCRAT_ALLOCATOR_H_ + +#include <squirrel.h> +#include <string.h> + +#include "sqratObject.h" + +namespace Sqrat { + +// +// DefaultAllocator +// + +template<class C> +class DefaultAllocator { +public: + static SQInteger New(HSQUIRRELVM vm) { + C* instance = new C(); + sq_setinstanceup(vm, 1, instance); + sq_setreleasehook(vm, 1, &Delete); + return 0; + } + + static SQInteger Copy(HSQUIRRELVM vm, SQInteger idx, const void* value) { + C* instance = new C(*static_cast<const C*>(value)); + sq_setinstanceup(vm, idx, instance); + sq_setreleasehook(vm, idx, &Delete); + return 0; + } + + static SQInteger Delete(SQUserPointer ptr, SQInteger size) { + C* instance = reinterpret_cast<C*>(ptr); + delete instance; + return 0; + } +}; + +// +// NoConstructorAllocator +// + +class NoConstructor { +public: + static SQInteger New(HSQUIRRELVM) { + return 0; + } + static SQInteger Copy(HSQUIRRELVM, SQInteger, const void*) { + return 0; + } + static SQInteger Delete(SQUserPointer, SQInteger) { + return 0; + } +}; + +// +// CopyOnly +// + +template<class C> +class CopyOnly { +public: + static SQInteger New(HSQUIRRELVM) { + return 0; + } + static SQInteger Copy(HSQUIRRELVM vm, SQInteger idx, const void* value) { + C* instance = new C(*static_cast<const C*>(value)); + sq_setinstanceup(vm, idx, instance); + sq_setreleasehook(vm, idx, &Delete); + return 0; + } + static SQInteger Delete(SQUserPointer ptr, SQInteger size) { + void* instance = reinterpret_cast<C*>(ptr); + delete instance; + return 0; + } +}; + + +// +// NoCopy +// + +template<class C> +class NoCopy { +public: + static SQInteger New(HSQUIRRELVM vm) { + C* instance = new C(); + sq_setinstanceup(vm, 1, instance); + sq_setreleasehook(vm, 1, &Delete); + return 0; + } + + static SQInteger Copy(HSQUIRRELVM vm, SQInteger idx, const void* value) { + return 0; + } + + static SQInteger Delete(SQUserPointer ptr, SQInteger size) { + C* instance = reinterpret_cast<C*>(ptr); + delete instance; + return 0; + } +}; + +} + +#endif |