libbio
Loading...
Searching...
No Matches
physical/wave/collapse/Helpers.h
Go to the documentation of this file.
1/*
2 * This file is a part of the Biology project by eons LLC.
3 * Biology (aka Develop Biology) is a framework for approaching software
4 * development from a natural sciences perspective.
5 *
6 * Copyright (C) 2025 Séon O'Shannon & eons LLC
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU Affero General Public License as
10 * published by the Free Software Foundation, either version 3 of the
11 * License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Affero General Public License for more details.
17 *
18 * You should have received a copy of the GNU Affero General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
22#pragma once
23
24#include "bio/common/Number.h"
28#include <vector>
29
30//@formatter:off
31#if BIO_CPP_VERSION < 11
32 #include <stdint.h>
33#else
34 #include <cstdint>
35#endif
36//@formatter:on
37
38namespace bio {
39namespace physical {
40namespace collapse_util {
41
42template < typename T >
43bool CollectValues(const ConstWaves& waves, ::std::vector< T >& values)
44{
45 values.clear();
46 values.reserve(waves.Size());
47 for (
48 SmartIterator wav = waves.Begin();
49 !wav.IsAfterEnd();
50 ++wav
51 )
52 {
54 BIO_SANITIZE(wave, , return false)
56 BIO_SANITIZE(symmetry, , return false)
57 const ByteStream& value = symmetry->GetValue();
58 if (!value.Is< T >())
59 {
60 return false;
61 }
62 values.push_back(value.As< T >());
63 }
64 return !values.empty();
65}
66
67template < typename Handler >
69{
70 ::std::vector< bool > values;
72 {
73 return ByteStream();
74 }
75 return handler.Handle(values);
76}
77
78template < typename Handler >
80{
81 {
82 ::std::vector< int8_t > values;
83 if (CollectValues(waves, values)) return handler.Handle(values);
84 }
85 {
86 ::std::vector< int16_t > values;
87 if (CollectValues(waves, values)) return handler.Handle(values);
88 }
89 {
90 ::std::vector< int32_t > values;
91 if (CollectValues(waves, values)) return handler.Handle(values);
92 }
93 {
94 ::std::vector< int64_t > values;
95 if (CollectValues(waves, values)) return handler.Handle(values);
96 }
97 {
98 ::std::vector< uint8_t > values;
99 if (CollectValues(waves, values)) return handler.Handle(values);
100 }
101 {
102 ::std::vector< uint16_t > values;
103 if (CollectValues(waves, values)) return handler.Handle(values);
104 }
105 {
106 ::std::vector< uint32_t > values;
107 if (CollectValues(waves, values)) return handler.Handle(values);
108 }
109 {
110 ::std::vector< uint64_t > values;
111 if (CollectValues(waves, values)) return handler.Handle(values);
112 }
113 {
114 ::std::vector< short > values;
115 if (CollectValues(waves, values)) return handler.Handle(values);
116 }
117 {
118 ::std::vector< unsigned short > values;
119 if (CollectValues(waves, values)) return handler.Handle(values);
120 }
121 {
122 ::std::vector< int > values;
123 if (CollectValues(waves, values)) return handler.Handle(values);
124 }
125 {
126 ::std::vector< unsigned int > values;
127 if (CollectValues(waves, values)) return handler.Handle(values);
128 }
129 {
130 ::std::vector< long > values;
131 if (CollectValues(waves, values)) return handler.Handle(values);
132 }
133 {
134 ::std::vector< unsigned long > values;
135 if (CollectValues(waves, values)) return handler.Handle(values);
136 }
137 {
138 ::std::vector< long long > values;
139 if (CollectValues(waves, values)) return handler.Handle(values);
140 }
141 {
142 ::std::vector< unsigned long long > values;
143 if (CollectValues(waves, values)) return handler.Handle(values);
144 }
145 {
146 ::std::vector< float > values;
147 if (CollectValues(waves, values)) return handler.Handle(values);
148 }
149 {
150 ::std::vector< double > values;
151 if (CollectValues(waves, values)) return handler.Handle(values);
152 }
153 {
154 ::std::vector< long double > values;
155 if (CollectValues(waves, values)) return handler.Handle(values);
156 }
157 {
158 ::std::vector< Number > values;
159 if (CollectValues(waves, values)) return handler.Handle(values);
160 }
161 return ByteStream();
162}
163
164} // namespace collapse_util
165} // namespace physical
166} // namespace bio
double value
Definition Potential.cpp:41
#define BIO_SANITIZE(test, success, failure)
Definition SanitizeMacros.h:94
Definition Arrangement.h:42
Definition ByteStream.h:63
Definition Pointer.h:115
Definition SmartIterator.h:40
bool CollectValues(const ConstWaves &waves, ::std::vector< T > &values)
Definition physical/wave/collapse/Helpers.h:43
ByteStream DispatchBool(const ConstWaves &waves, const Handler &handler)
Definition physical/wave/collapse/Helpers.h:68
ByteStream DispatchNumeric(const ConstWaves &waves, const Handler &handler)
Definition physical/wave/collapse/Helpers.h:79
Definition FinalCell.h:29