Template Class IntegratorBuilder

Class Documentation

template<system_state S>
class IntegratorBuilder

Builder for composing multiple facilities.

This allows flexible combination of any facilities without exponential class combinations. Uses the decorator pattern to stack facilities in any order.

Key Design Principles:

  • Fluent Interface: Chainable method calls

  • Order Independence: Facilities work in any composition order

  • Type Safety: Compile-time type checking

  • Extensibility: Easy to add new facilities without modification

Example Usage:

auto integrator = make_builder(base_integrator)
    .with_timeout(TimeoutConfig{.timeout_duration = std::chrono::seconds{30}})
    .with_parallel(ParallelConfig{.max_threads = 8})
    .with_signals()
    .with_output(OutputConfig{.mode = OutputMode::HYBRID})
    .build();

Public Functions

inline explicit IntegratorBuilder(std::unique_ptr<AbstractIntegrator<S>> integrator)

Construct builder with base integrator.

Parameters:

integrator – The integrator to build upon (takes ownership)

inline IntegratorBuilder &with_timeout(TimeoutConfig config = {})

Add timeout protection facility.

Parameters:

config – Timeout configuration (uses defaults if not specified)

Throws:

std::invalid_argument – if config is invalid

Returns:

Reference to this builder for chaining

inline IntegratorBuilder &with_parallel(ParallelConfig config = {})

Add parallel execution facility.

Parameters:

config – Parallel configuration (uses defaults if not specified)

Throws:

std::invalid_argument – if config is invalid

Returns:

Reference to this builder for chaining

inline IntegratorBuilder &with_output(OutputConfig config = {}, std::function<void(const S&, typename AbstractIntegrator<S>::time_type, size_t)> handler = nullptr)

Add output handling facility.

Parameters:
  • config – Output configuration (uses defaults if not specified)

  • handler – Optional output handler function

Throws:

std::invalid_argument – if config is invalid

Returns:

Reference to this builder for chaining

inline IntegratorBuilder &with_signals(SignalConfig config = {})

Add signal processing facility.

Parameters:

config – Signal configuration (uses defaults if not specified)

Throws:

std::invalid_argument – if config is invalid

Returns:

Reference to this builder for chaining

inline IntegratorBuilder &with_interpolation(InterpolationConfig config = {})

Add interpolation facility.

Parameters:

config – Interpolation configuration (uses defaults if not specified)

Throws:

std::invalid_argument – if config is invalid

Returns:

Reference to this builder for chaining

inline IntegratorBuilder &with_interprocess(InterprocessConfig config = {})

Add interprocess facility.

Parameters:

config – Interprocess configuration (uses defaults if not specified)

Throws:

std::invalid_argument – if config is invalid

Returns:

Reference to this builder for chaining

inline std::unique_ptr<AbstractIntegrator<S>> build()

Build the final composed integrator.

Note: After calling build(), the builder is left in a valid but unspecified state. Do not use the builder after calling build().

Returns:

Unique pointer to the composed integrator

template<typename DecoratorType>
inline DecoratorType *get_as()

Get specific decorator type from the composition chain.

Note: This performs a dynamic_cast and may be expensive. Use sparingly.

Example:

auto builder = make_builder(base).with_timeout().with_async();
auto* timeout_decorator = builder.get_as<TimeoutDecorator<S, T>>();
if (timeout_decorator) {
    // Access timeout-specific functionality
    timeout_decorator->config().timeout_duration = std::chrono::seconds{60};
}

Template Parameters:

DecoratorType – The specific decorator type to retrieve

Returns:

Pointer to the decorator, or nullptr if not found

inline bool is_valid() const

Check if the builder has a valid integrator.

Returns:

true if the builder can still be used

inline std::string get_composition_info() const

Get information about the current composition.

Returns:

String describing the current decorator stack