Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add explicit keyword to one-parameter constructors.
[simgrid.git] / include / xbt / dynar.hpp
1 /* Copyright (c) 2004-2007, 2009-2017. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #ifndef SIMGRID_XBT_DYNAR_HPP
8 #define SIMGRID_XBT_DYNAR_HPP
9
10 #include <boost/range/iterator_range.hpp>
11 #include <xbt/asserts.h>
12 #include <xbt/dynar.h>
13
14 namespace simgrid {
15 namespace xbt {
16
17 /** A C++ range from a a dynar */
18 template<class T>
19 using DynarRange = boost::iterator_range<T*>;
20
21 /** Create an iterator range representing a dynar
22  *
23  *  C++ range loops for `xbt_dynar_t`:
24  *
25  *  <code>for (auto& x : range<double>(some_dynar)) ++x;</code>
26  */
27 template<class T> inline
28 DynarRange<T> range(xbt_dynar_t dynar)
29 {
30   xbt_assert(dynar->elmsize == sizeof(T));
31   return DynarRange<T>((T*) dynar->data,
32     (T*) ((char*) dynar->data + dynar->used * dynar->elmsize));
33 }
34
35 /** Dynar of `T*` which `delete` its values */
36 template<class T> inline
37 xbt_dynar_t newDeleteDynar()
38 {
39   return xbt_dynar_new(sizeof(T*),
40     [](void* p) { delete *(T**)p; });
41 }
42
43 }
44 }
45 #endif