1 /* Copyright (c) 2004-2007, 2009-2015. The SimGrid Team.
2 * All rights reserved. */
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. */
7 #ifndef SIMGRId_XBT_DYNAR_HPP
8 #define SIMGRId_XBT_DYNAR_HPP
10 #include <boost/range/iterator_range.hpp>
11 #include <xbt/asserts.h>
12 #include <xbt/dynar.h>
17 /** A C++ range from a a dynar */
19 using DynarRange = boost::iterator_range<T*>;
21 /** Create an iterator range representing a dynar
23 * C++ range loops for `xbt_dynar_t`:
25 * <code>for (auto& x : range<double>(some_dynar)) ++x;</code>
27 template<class T> inline
28 DynarRange<T> range(xbt_dynar_t dynar)
30 xbt_assert(dynar->elmsize == sizeof(T));
31 return DynarRange<T>((T*) dynar->data,
32 (T*) ((char*) dynar->data + dynar->used * dynar->elmsize));
35 /** Dynar of `T*` which `delete` its values */
36 template<class T> inline
37 xbt_dynar_t newDeleteDynar()
39 return xbt_dynar_new(sizeof(T*),
40 [](void* p) { delete *(T**)p; });
43 /** Dynar of `T*` which `destroy()` its values */
44 template<class T> inline
45 xbt_dynar_t newDestroyDynar()
47 return xbt_dynar_new(sizeof(T*),
48 [](void* p) { simgrid::xbt::destroy(*(T**)p); });