Vector Optimized Library of Kernels  2.5.0
Architecture-tuned implementations of math kernels
volk_alloc.hh
Go to the documentation of this file.
1 /* -*- C++ -*- */
2 /*
3  * Copyright 2019 Free Software Foundation, Inc.
4  *
5  * This file is part of GNU Radio
6  *
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  *
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING. If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22 
23 #ifndef INCLUDED_VOLK_ALLOC_H
24 #define INCLUDED_VOLK_ALLOC_H
25 
26 #include <cstdlib>
27 #include <limits>
28 #include <new>
29 #include <vector>
30 
31 #include <volk/volk.h>
32 
33 namespace volk {
34 
41 template <class T>
42 struct alloc {
43  typedef T value_type;
44 
45  alloc() = default;
46 
47  template <class U>
48  constexpr alloc(alloc<U> const&) noexcept
49  {
50  }
51 
52  T* allocate(std::size_t n)
53  {
54  if (n > std::numeric_limits<std::size_t>::max() / sizeof(T))
55  throw std::bad_alloc();
56 
57  if (auto p = static_cast<T*>(volk_malloc(n * sizeof(T), volk_get_alignment())))
58  return p;
59 
60  throw std::bad_alloc();
61  }
62 
63  void deallocate(T* p, std::size_t) noexcept { volk_free(p); }
64 };
65 
66 template <class T, class U>
67 bool operator==(alloc<T> const&, alloc<U> const&)
68 {
69  return true;
70 }
71 
72 template <class T, class U>
73 bool operator!=(alloc<T> const&, alloc<U> const&)
74 {
75  return false;
76 }
77 
78 
86 template <class T>
87 using vector = std::vector<T, alloc<T>>;
88 
89 } // namespace volk
90 #endif // INCLUDED_VOLK_ALLOC_H
Definition: volk_alloc.hh:33
bool operator==(alloc< T > const &, alloc< U > const &)
Definition: volk_alloc.hh:67
std::vector< T, alloc< T > > vector
type alias for std::vector using volk::alloc
Definition: volk_alloc.hh:87
bool operator!=(alloc< T > const &, alloc< U > const &)
Definition: volk_alloc.hh:73
C++11 allocator using volk_malloc and volk_free.
Definition: volk_alloc.hh:42
void deallocate(T *p, std::size_t) noexcept
Definition: volk_alloc.hh:63
T value_type
Definition: volk_alloc.hh:43
T * allocate(std::size_t n)
Definition: volk_alloc.hh:52
alloc()=default
constexpr alloc(alloc< U > const &) noexcept
Definition: volk_alloc.hh:48
size_t volk_get_alignment(void)
Get the machine alignment in bytes.
Definition: volk.tmpl.c:102
__VOLK_DECL_BEGIN VOLK_API void * volk_malloc(size_t size, size_t alignment)
Allocate size bytes of data aligned to alignment.
Definition: volk_malloc.c:51
VOLK_API void volk_free(void *aptr)
Free's memory allocated by volk_malloc.
Definition: volk_malloc.c:93