1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 #ifndef INCLUDED_SC_INC_STLALGORITHM_HXX
11 #define INCLUDED_SC_INC_STLALGORITHM_HXX
15 #include <rtl/alloc.h>
20 * Custom allocator for STL container to ensure that the base address of
21 * allocated storage is aligned to a specified boundary.
23 template<typename T
, size_t Alignment
>
24 class AlignedAllocator
28 typedef size_t size_type
;
29 typedef std::ptrdiff_t difference_type
;
32 typedef const T
* const_pointer
;
33 typedef T
* void_pointer
;
36 typedef const T
& const_reference
;
38 template<typename Type2
>
41 typedef AlignedAllocator
<Type2
,Alignment
> other
;
46 template<typename Type2
>
47 AlignedAllocator(const AlignedAllocator
<Type2
,Alignment
>&) {}
49 static void construct(T
* p
, const value_type
& val
) { new(p
) value_type(val
); }
50 static void destroy(T
* p
)
53 (void)p
; // avoid bogus MSVC '12 "unreferenced formal parameter" warning
56 static size_type
max_size()
58 return std::numeric_limits
<size_type
>::max() / sizeof(value_type
);
61 bool operator== (const AlignedAllocator
&) const { return true; }
62 bool operator!= (const AlignedAllocator
&) const { return false; }
64 static pointer
allocate(size_type n
)
66 return static_cast<pointer
>(rtl_allocateAlignedMemory(Alignment
, n
*sizeof(value_type
)));
69 static void deallocate(pointer p
, size_type
)
71 rtl_freeAlignedMemory(p
);
79 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */