Program Listing for File state_concept_usage.cpp

Return to documentation for file (examples/state_concept_usage.cpp)

#include <iostream>
#include <vector>
#include <array>
#include <deque>
#include "core/concepts.hpp"

// Example function that works with any system_state-satisfying type
template<system_state S>
void print_state_info(const S& state) {
    std::cout << "State type: " << typeid(S).name() << std::endl;
    std::cout << "Size: " << state.size() << std::endl;
    std::cout << "Values: ";
    for (const auto& value : state) {
        std::cout << value << " ";
    }
    std::cout << std::endl << std::endl;
}

// Example function that modifies a state
template<system_state S>
void initialize_state(S& state, typename S::value_type initial_value = {}) {
    for (std::size_t i = 0; i < state.size(); ++i) {
        auto it = state.begin();
        it[i] = initial_value + static_cast<typename S::value_type>(i);
    }
}

int main() {
    std::cout << "State Concept Usage Examples" << std::endl;
    std::cout << "============================" << std::endl << std::endl;

    // Example 1: std::vector<double> (common for numerical computations)
    std::vector<double> vector_state(5);
    initialize_state(vector_state, 1.0);
    std::cout << "Example 1 - Vector State:" << std::endl;
    print_state_info(vector_state);

    // Example 2: std::array<float, 4> (fixed-size, good for small states)
    std::array<float, 4> array_state;
    initialize_state(array_state, 2.5f);
    std::cout << "Example 2 - Array State:" << std::endl;
    print_state_info(array_state);

    // Example 3: std::deque<int> (good for dynamic resizing)
    std::deque<int> deque_state(3);
    initialize_state(deque_state, 10);
    std::cout << "Example 3 - Deque State:" << std::endl;
    print_state_info(deque_state);

    // Example 4: Custom state class
    class CustomState {
    public:
        using value_type = double;

        std::vector<double> data;
        std::string name;

        CustomState(const std::string& n, std::size_t size)
            : data(size, 0.0), name(n) {}

        std::size_t size() const { return data.size(); }
        auto begin() { return data.begin(); }
        auto end() { return data.end(); }
        auto begin() const { return data.begin(); }
        auto end() const { return data.end(); }

        // Add array indexing access required by system_state concept
        double& operator[](std::size_t index) { return data[index]; }
        const double& operator[](std::size_t index) const { return data[index]; }

        const std::string& get_name() const { return name; }
    };

    CustomState custom_state("MyState", 6);
    initialize_state(custom_state, 0.5);
    std::cout << "Example 4 - Custom State (name: " << custom_state.get_name() << "):" << std::endl;
    print_state_info(custom_state);

    return 0;
}