# ==============================================================================
# sangi example code
# ==============================================================================

set(LIB23_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/include")

# All public sangi static libraries. Every example links the full set; static-
# library linking only pulls the object files that resolve referenced symbols,
# so over-linking is harmless and keeps the per-example link lines simple.
# (sangi_rational transitively pulls sangi_int + sangi_float + sangi_fft.)
set(SANGI_PUBLIC_LIBS sangi_rational sangi_matrix)

# Helper: create example target
function(add_sangi_example EXAMPLE_NAME EXAMPLE_SOURCE)
    add_executable(${EXAMPLE_NAME} ${EXAMPLE_SOURCE})
    target_include_directories(${EXAMPLE_NAME} PRIVATE ${LIB23_INCLUDE_DIR})
    target_link_libraries(${EXAMPLE_NAME} PRIVATE ${SANGI_PUBLIC_LIBS} ${ARGN})
    set_target_properties(${EXAMPLE_NAME} PROPERTIES FOLDER "Examples")
endfunction()

# Int
add_sangi_example(example-int example_int.cpp sangi_int)
add_sangi_example(example-int-demo example_int_demo.cpp sangi_int)

# Float
add_sangi_example(example-float example_float.cpp sangi_float)
add_sangi_example(example-float-demo example_float_demo.cpp sangi_float)

# Rational
add_sangi_example(example-rational example_rational.cpp sangi_rational)
add_sangi_example(example-rational-demo example_rational_demo.cpp sangi_rational)

# Multi-precision (Int + Float + Rational)
add_sangi_example(example-mp example_mp.cpp sangi_rational)

# Vector
add_sangi_example(example-vector example_vector.cpp)
add_sangi_example(example-vector-demo example_vector_demo.cpp)

# Matrix
add_sangi_example(example-matrix example_matrix.cpp sangi_rational)
add_sangi_example(example-matrix-demo example_matrix_demo.cpp sangi_rational)

# LinAlg (uses ThreadPool.hpp -> std::thread -> pthread on Linux)
add_sangi_example(example-linalg example_linalg.cpp sangi_rational)

# Polynomial
add_sangi_example(example-polynomial example_polynomial.cpp)
add_sangi_example(example-polynomial-factorization example_polynomial_factorization.cpp)

# Roots
add_sangi_example(example-roots example_roots.cpp)

# Complex
add_sangi_example(example-complex example_complex.cpp)

# Optimization
add_sangi_example(example-optimization example_optimization.cpp)

# FFT
add_sangi_example(example-fft example_fft.cpp)

# RationalFunction (header-only; rational functions, partial fractions)
add_sangi_example(example-rationalfunction example_rationalfunction.cpp)

# Tensor (multidimensional array)
add_sangi_example(example-tensor example_tensor.cpp)

# Random (distributions, engines, quasi-random)
add_sangi_example(example-random example_random.cpp)

# Precision Showdown (Matrix + Float + Rational)
add_sangi_example(example-precision-showdown example_precision_showdown.cpp sangi_rational)

# ==============================================================================
# Harness for verifying api/*.html documentation (15 groups) — build & run to
# reproduce the verified-output annotations in the docs
# ==============================================================================
add_sangi_example(example-doc-roots-samples         example_doc_roots_samples.cpp)
add_sangi_example(example-doc-rationalfunction-samples example_doc_rationalfunction_samples.cpp)
add_sangi_example(example-doc-random-samples        example_doc_random_samples.cpp)
add_sangi_example(example-doc-vector-samples        example_doc_vector_samples.cpp)
add_sangi_example(example-doc-matrix-samples        example_doc_matrix_samples.cpp)
add_sangi_example(example-doc-tensor-samples        example_doc_tensor_samples.cpp)
add_sangi_example(example-doc-complex-samples       example_doc_complex_samples.cpp)
add_sangi_example(example-doc-concepts-samples      example_doc_concepts_samples.cpp sangi_int sangi_rational)
add_sangi_example(example-doc-rational-samples      example_doc_rational_samples.cpp sangi_int sangi_float sangi_rational)
add_sangi_example(example-doc-polynomial-samples    example_doc_polynomial_samples.cpp sangi_int sangi_float sangi_rational)
add_sangi_example(example-doc-optimization-samples  example_doc_optimization_samples.cpp)
add_sangi_example(example-doc-fft-samples           example_doc_fft_samples.cpp sangi_fft)
add_sangi_example(example-doc-float-samples         example_doc_float_samples.cpp sangi_int sangi_float)
add_sangi_example(example-doc-linalg-samples        example_doc_linalg_samples.cpp sangi_int sangi_float sangi_rational)
add_sangi_example(example-doc-int-samples           example_doc_int_samples.cpp sangi_int)
