#pragma once namespace serif::discretization::blocks { inline constexpr int DYNAMIC_BLOCK_SIZE = -1; struct block {}; struct residual_block_base : block { static constexpr int static_block_size = DYNAMIC_BLOCK_SIZE; }; struct value_block_base : block { static constexpr int static_block_size = DYNAMIC_BLOCK_SIZE; }; template struct generated_value_block final : value_block_base { using GeneratedType = GeneratedValue; static constexpr int static_block_size = static_cast(GeneratedValue::scalarArity); }; template struct generated_residual_block final : residual_block_base { using GeneratedType = GeneratedResidual; static constexpr int static_block_size = static_cast(GeneratedResidual::scalarArity); }; template struct residual_block final : residual_block_base { static constexpr int index = index_value; // ReSharper disable once CppNonExplicitConversionOperator constexpr operator int() const noexcept { return index; } }; template struct value_block final : value_block_base { static constexpr int index = index_value; // ReSharper disable once CppNonExplicitConversionOperator constexpr operator int() const noexcept { return index; } }; }