GCC Code Coverage Report


Directory: ./
File: pdcom5/src/Selector.h
Date: 2024-11-17 04:08:36
Exec Total Coverage
Lines: 3 3 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 /*****************************************************************************
2 *
3 * Copyright (C) 2021 Bjarne von Horn (vh at igh dot de).
4 *
5 * This file is part of the PdCom library.
6 *
7 * The PdCom library is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * The PdCom library is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 * License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with the PdCom library. If not, see <http://www.gnu.org/licenses/>.
19 *
20 *****************************************************************************/
21
22 #ifndef PDCOM_IMPL_SELECTOR_H
23 #define PDCOM_IMPL_SELECTOR_H
24
25 #include <functional>
26 #include <pdcom5/SizeTypeInfo.h>
27 #include <pdcom5/Variable.h>
28 #include <vector>
29
30 namespace PdCom { namespace impl {
31 class Variable;
32
33 /** Selector base class for creating views on multidimensional data.
34 *
35 * Developers have to override clone(), getRequiredSize() and getCopyFunction()
36 * in their derived class.
37 *
38 */
39 131 struct Selector
40 {
41 using CopyFunctionType = std::function<
42 void(void * /* destination */, const void * /* src */)>;
43
44 131 virtual ~Selector() = default;
45 /** Required size of the view, in bytes.
46 *
47 * \return The required memory space for the view, in bytes.
48 */
49 virtual std::size_t getRequiredSize(const Variable &variable) const;
50 /** Smart memcpy().
51 *
52 * \returns A functor which will copy arriving variable data to the provided
53 * view memory.
54 */
55 virtual CopyFunctionType getCopyFunction(const Variable &variable) const;
56
57 virtual PdCom::Variable::SetValueFuture applySetValue(
58 const Variable &variable,
59 const void *src_data,
60 TypeInfo::DataType src_type,
61 size_t src_count) const;
62
63 virtual SizeInfo getViewSizeInfo(const Variable &variable) const;
64 };
65
66 /** Selects one scalar out of a vector or matrix.
67 *
68 * The index is in Row major format, ((layer, )row, column).
69 */
70 24 class ScalarSelector : public Selector
71 {
72 std::vector<int> indices_;
73
74 public:
75 std::size_t getRequiredSize(const Variable &) const override;
76 CopyFunctionType getCopyFunction(const Variable &) const override;
77
78 ScalarSelector(std::vector<int> indices);
79
80 size_t getOffset(const Variable &variable) const;
81
82 SizeInfo getViewSizeInfo(const Variable &variable) const override;
83
84 PdCom::Variable::SetValueFuture applySetValue(
85 const Variable &variable,
86 const void *src_data,
87 TypeInfo::DataType src_type,
88 size_t src_count) const override;
89 };
90 }} // namespace PdCom::impl
91
92
93 #endif // PDCOM_IMPL_SELECTOR_H
94