DiffEq - Modern C++ ODE Integration Library 1.0.0
High-performance C++ library for solving ODEs with async signal processing
Loading...
Searching...
No Matches
state_concept_usage.cpp
1#include <iostream>
2#include <vector>
3#include <array>
4#include <deque>
5#include "core/concepts.hpp"
6
7// Example function that works with any system_state-satisfying type
8template<system_state S>
9void print_state_info(const S& state) {
10 std::cout << "State type: " << typeid(S).name() << std::endl;
11 std::cout << "Size: " << state.size() << std::endl;
12 std::cout << "Values: ";
13 for (const auto& value : state) {
14 std::cout << value << " ";
15 }
16 std::cout << std::endl << std::endl;
17}
18
19// Example function that modifies a state
20template<system_state S>
21void initialize_state(S& state, typename S::value_type initial_value = {}) {
22 for (std::size_t i = 0; i < state.size(); ++i) {
23 auto it = state.begin();
24 it[i] = initial_value + static_cast<typename S::value_type>(i);
25 }
26}
27
28int main() {
29 std::cout << "State Concept Usage Examples" << std::endl;
30 std::cout << "============================" << std::endl << std::endl;
31
32 // Example 1: std::vector<double> (common for numerical computations)
33 std::vector<double> vector_state(5);
34 initialize_state(vector_state, 1.0);
35 std::cout << "Example 1 - Vector State:" << std::endl;
36 print_state_info(vector_state);
37
38 // Example 2: std::array<float, 4> (fixed-size, good for small states)
39 std::array<float, 4> array_state;
40 initialize_state(array_state, 2.5f);
41 std::cout << "Example 2 - Array State:" << std::endl;
42 print_state_info(array_state);
43
44 // Example 3: std::deque<int> (good for dynamic resizing)
45 std::deque<int> deque_state(3);
46 initialize_state(deque_state, 10);
47 std::cout << "Example 3 - Deque State:" << std::endl;
48 print_state_info(deque_state);
49
50 // Example 4: Custom state class
51 class CustomState {
52 public:
53 using value_type = double;
54
55 std::vector<double> data;
56 std::string name;
57
58 CustomState(const std::string& n, std::size_t size)
59 : data(size, 0.0), name(n) {}
60
61 std::size_t size() const { return data.size(); }
62 auto begin() { return data.begin(); }
63 auto end() { return data.end(); }
64 auto begin() const { return data.begin(); }
65 auto end() const { return data.end(); }
66
67 // Add array indexing access required by system_state concept
68 double& operator[](std::size_t index) { return data[index]; }
69 const double& operator[](std::size_t index) const { return data[index]; }
70
71 const std::string& get_name() const { return name; }
72 };
73
74 CustomState custom_state("MyState", 6);
75 initialize_state(custom_state, 0.5);
76 std::cout << "Example 4 - Custom State (name: " << custom_state.get_name() << "):" << std::endl;
77 print_state_info(custom_state);
78
79 return 0;
80}