3
0
mirror of https://github.com/triqs/dft_tools synced 2024-11-01 03:33:50 +01:00
dft_tools/doc/reference/arrays/foreach.rst
Olivier Parcollet 47cb8a03f7 [arrays] Important changes in implementation.
- Simplify group_indices
  - Only for C ordered, remove complex compile time.
  - Could be generalized to non C ordered, but no need.
- Fix slice for custom orders.
- Generalize the group_indices for the custom order.
- Add c_ordered_transposed_view (useful ?)
- Improve slice, special for ellipsis (quicker).
- Simplify TraversalOrder
- Assignement. Specialize one case for speed.
- use FORCEINLINE in foreach, according to speed test for clang
- add one speed test
- Modify iterators for better speed.
- along the lines decided for the foreach
- update doc.
2014-10-18 21:20:17 +02:00

87 lines
2.7 KiB
ReStructuredText

.. highlight:: c
.. _Foreach:
Loops: the foreach constructs
========================================================
foreach and its variants are a compact and efficient way to
perform some action of the kind
*For all indices of the array, do something*
While this kind of construct is equivalent to write manually the *for* loops, it has
several advantages:
* it is more compact, less error prone (one does not need to specify the bounds in the loop).
* The library orders the loops in way specified by the template parameters TraversalOrder (by default, the standard C order),
to obtain the most efficient way to traverse the memory.
* it is easier to write generic code for array of several dimensions.
foreach
------------
The *foreach* function call a given function *f* successively on the indices of an array *A*,
in the order specified by the TraversalOrder of the array.
* Synopsis::
template <typename ArrayType, typename Function>
void foreach (ArrayType const & A, Function F);
* A is an array/matrix/vector or the corresponding view.
* The template is enabled iif ImmutableArray<ArrayType>::value == true
* F is a function with the following synopsis ::
F(size_t ... indices)
* The foreach algorithm is equivalent to ::
for (i,j,k...) F(i,j,k...)
* The for loop are automatically organised to optimize the traversal order of A
using the TraversalOrder of the array.
* As a result this is always equally or more optimized than a manually written loop.
Example:
.. triqs_example:: ./foreach_0.cpp
.. note::
You *can* pass a std::function as Function, but it is not recommended in critical parts of the code.
The indirection caused by std::function at each call may lead to big performance penalty.
The call to lambda, or a custom callable object will on the other hand by inlined.
assign_foreach
----------------
assign_foreach is a simpler form that assigns the return value of the function to the array elements.
Note that using the lazy expression is usually a lot simpler (except when you already have the function ready).
Synopsis::
template <typename ArrayType, typename Function>
void assign_foreach (ArrayType const & A, Function F);
* A is an array/matrix/vector or the corresponding view.
* The template is enabled iif ImmutableArray<ArrayType>::value == true
* F is a function with the following synopsis ::
F(size_t ... indices)
* The assign_foreach algorithm is equivalent to ::
for (i,j,k...) A(i,j,k...) = F(i,j,k...)
* The for loop are automatically organised to optimize the traversal order of A
using the TraversalOrder of the array.
.. triqs_example:: ./foreach_1.cpp
.. note::
Cf the note of the *foreach* function.