Library of Assembled Shared Sources
prim_allocator.h
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2011 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42#ifndef LASS_GUARDIAN_OF_INCLUSION_PRIM_IMPL_ALLOCATOR_H
43#define LASS_GUARDIAN_OF_INCLUSION_PRIM_IMPL_ALLOCATOR_H
44
45#include "../prim_common.h"
48
49namespace lass
50{
51namespace prim
52{
53namespace impl
54{
55
56LASS_DLL void* allocateMemory(size_t size);
57LASS_DLL void deallocateMemory(void* mem, size_t size);
58
59template <typename T, bool hasTrivialConstructorAndDestructor>
60class AllocatorHelper
61{
62public:
63 static T* allocate(size_t n)
64 {
65 return static_cast<T*>(allocateMemory(n * sizeof(T)));
66 }
67 static void deallocate(T* p, size_t n)
68 {
69 deallocateMemory(p, n * sizeof(T));
70 }
71};
72
73template <typename T>
74class AllocatorHelper<T, false>
75{
76public:
77 static T* allocate(size_t n)
78 {
79 // Kids, don't try this at home, we're trained professionals here! ;)
80 //
81 T* p = static_cast<T*>(allocateMemory(n * sizeof(T)));
82 for (size_t i = 0; i < n; ++i)
83 {
84 try
85 {
86 new(&p[i]) T();
87 }
88 catch (...)
89 {
90 deallocate(p, n, i);
91 throw;
92 }
93 }
94 return p;
95 }
96 static void deallocate(T* p, size_t n)
97 {
98 deallocate(p, n, n);
99 }
100private:
101 static void deallocate(T* p, size_t n, size_t i)
102 {
103 while (i > 0)
104 {
105 p[--i].~T();
106 }
107 deallocateMemory(p, n * sizeof(T));
108 }
109};
110
111template <typename T>
112T* allocateArray(size_t n)
113{
114 return AllocatorHelper<T, meta::IsTrivial<T>::value>::allocate(n);
115}
116
117template <typename T>
118void deallocateArray(T* p, size_t n)
119{
120 AllocatorHelper<T, meta::IsTrivial<T>::value>::deallocate(p, n);
121}
122
123
124}
125}
126}
127
128#endif
129
130// EOF
#define LASS_DLL
DLL interface: import or export symbols?
implementation details of lass::prim
set of geometrical primitives
Definition aabb_2d.h:81
Library for Assembled Shared Sources.
Definition config.h:53