Skip to content

fix(Geosciences): robustness and performance review - #205

Merged
BenPinet merged 73 commits into
nextfrom
fix/robustness-performance-review
Oct 22, 2026
Merged

BenPinet merged 73 commits into
nextfrom
fix/robustness-performance-review

Conversation

@BotellaA

Copy link
Copy Markdown
Member

Fixes from a robustness and performance review of the whole library. There are 67 commits. Each commit holds one fix and the test for it. Each test was checked to fail, hang or crash before its fix.

Behaviour changes to know about

  • HorizonsStackBuilder::set_horizon_above / set_horizon_under
    • Throw for a horizon or unit that is not in the stack.
    • When a relation already exists, keep it and log a warning instead of adding a duplicate edge. The Skua reader in GeosciencesIO depends on this: an erosion horizon stays above the youngest unit.
  • add_above_relation throws when the new relation would close a cycle. Cyclic .og_hst files are repaired on load, with a warning.
  • StructuralModelBuilder::copy / CrossSectionBuilder::copy require an empty target model, like BRepBuilder::copy.
  • noexcept removed from the converting constructors that can throw, for the explicit, implicit and stratigraphic models and sections. Non-triangulated surfaces and non-tetrahedral blocks are now skipped instead of throwing.
  • Geographic coordinate system conversion
    • Uses x = longitude and y = latitude for geographic CRSs (OAMS_TRADITIONAL_GIS_ORDER).
    • Throws on unknown CRS codes.
    • Is atomic over a whole BRep or Section.
  • New API
    • set_*_active for geological components.
    • StratigraphicSectionBuilder::copy_stratigraphic_attribute_values.
    • Python bindings for add_horizon_in_stratigraphic_unit and compute_top_and_bottom_horizons.
  • Removed: GeographicCoordinateSystem::create_from_attribute, which was declared but never defined.

Main fixes

  • Infinite loops
    • containing_stratigraphic_unit looped forever for any value between two horizons.
    • Cycles in above/under relations hung the stack walks and file loading.
  • Lost values
    • Implicit values and stratigraphic locations were lost (all zero) by the model-from-attribute helpers.
    • The same happened in clone(), in the (initial, BRep/Section, mappings) constructors, and when copying a StratigraphicSection.
  • Crashes and undefined behaviour
    • Unchecked optional::value() in horizon ranges, string() and the blocks-to-units builder.
    • Empty meshes in containment queries.
    • Stale query caches.
    • Null GDAL transformation.
    • Out-of-bounds read with empty name lists.
  • Corrupted or old files
    • String sizes in the CRS info are now bounded.
    • Out-of-range fault and contact types are repaired with a warning.
    • Duplicated implicit attributes are removed.
    • Stale horizon isovalues are dropped.
    • Old models without fault blocks or stratigraphic units no longer warn.
  • Copy and import
    • Skip meshes without the attribute.
    • Remove the stale same-name attributes.
    • Copy the isovalues of the stack horizons.
  • Blocks to stratigraphic units
    • Fixed two unreachable conformal/erosion/baselap cases.
    • Blocks bounded by more than two conformal horizons are no longer assigned from an arbitrary horizon.
    • Only empty units created by the helper itself are removed.

Performance

  • Fault blocks builder: hash sets instead of the O(B²) linear scans.
  • Blocks-to-units assignment: worklist instead of rescanning every block on each pass.
  • Stratigraphic model:
    • Attributes are resolved once per component.
    • The bounding box is computed from vertices instead of building AABB trees.
    • invalid_stratigraphic_tetrahedra computes coordinates once per vertex and logs one summary line.
  • CRS conversion: one transformation per source CRS, and one batched Transform call.
  • Stratigraphic relationships: indexed edge lookup.

Checks

  • Full ctest passes, built against the current OpenGeode next.
  • OpenGeode-GeosciencesIO next, built against this branch, passes all 21 of its tests, including the Skua horizons stack test.
  • The Python bindings compile.

🤖 Generated with Claude Code

BotellaA and others added 30 commits October 22, 2026 09:47
Corrupted files could request a huge allocation when reading the CRS
authority, code or name. Use MAX_SERIALIZED_NAME_SIZE as for other
serialized names, the wire format is unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…_coordinates

SetFromUserInput errors were ignored and a null transformation was
dereferenced, crashing on unknown or empty authority codes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… failure

The OGR transformation leaked when a point conversion threw. Own it with a
unique_ptr using OGRCoordinateTransformation::DestroyCT.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Without OAMS_TRADITIONAL_GIS_ORDER, GDAL uses the authority axis order and
geographic CRSs such as EPSG:4326 expect latitude first, swapping the
coordinates of meshes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…iled mesh conversion

The new CRS attribute was created before checking that the active CRS is
geographic, and kept when the coordinate import failed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ning info

The attribute was renamed before registering the new CRS, which threw when
the name already existed, including when reusing the active CRS name. Check
the name first and support replacing the active CRS under the same name.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ations atomic

Converting or assigning a CRS on a model mutated components one by one, so
an invalid component (existing CRS name, non geographic or unknown active
CRS, failed point conversion) left the model half converted. Validate all
components and compute all converted coordinates before modifying any
mesh. The coordinate transformation is factored in an internal
GeographicCoordinateTransformation class.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ons across model components

BRep and Section conversions created two OGRSpatialReference and one
coordinate transformation per component. Create them once per source CRS.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Call OGRCoordinateTransformation::Transform once on coordinate arrays
instead of once per point, and report the number of points that failed to
convert. Conversion still throws if any point fails.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…uctors

StructuralModel and CrossSection constructors taking an initial model,
a BRep/Section and a component mapping call
transfer_geological_information, which throws when the mapping refers to
components missing from the new model. Being noexcept, they called
std::terminate instead of propagating the exception.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Horizon, Fault, FaultBlock and StratigraphicUnit item ranges of
StructuralModel and CrossSection dereferenced every item of the
collection as a Surface/Block (resp. Line/Surface), throwing as soon as
an item of another type was in the collection (e.g. added through the
public add_item_in_collection or read from a corrupted file). Items with
an unexpected component type are now skipped when the range is created
and when it is incremented.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ransfer

When several initial components map to the same new component,
transfer_geological_information added the same item to the same
geological collection repeatedly, each time scanning the relationships
and logging a "relation already exists" warning. Items already added to
a collection during the transfer are now skipped.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Fault type and Horizon contact type are deserialized as raw integers and
were never validated, so a corrupted file could yield enum values outside
of FAULT_TYPE / CONTACT_TYPE. Such values are now reset to no_type
(Fault) or conformal (Horizon) with a warning. The legacy Horizon
contact type conversion also warns instead of silently falling back to
conformal on unknown values.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
add_geology_clone_mapping emplaced the Fault and FaultBlock mappings,
throwing when the given ModelCopyMapping already had an entry for these
types, whereas Horizon and StratigraphicUnit mappings were merged. Faults
and FaultBlocks are now merged the same way, keeping existing entries.

Also drop the meaningless [[nodiscard]] on the void
add_horizons_clone_mapping and add_stratigraphic_units_clone_mapping
helpers (no behavior change, hence not separately tested).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…nt mappings

add_geological_components_mappings emplaced one GenericMapping per
geological component type, throwing when the ModelGenericMapping
already had an entry for that type. Geological mappings are now merged
into the existing entries, and missing geological types are ignored
instead of throwing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ctivity

Faults, Horizons, FaultBlocks and StratigraphicUnits can now be set
active or inactive through set_fault_active, set_horizon_active,
set_fault_block_active and set_stratigraphic_unit_active, mirroring the
OpenGeode mesh and collection component builders. The setters are also
exposed in the Python bindings.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Copying or cloning a StructuralModel or CrossSection created the
geological components as active regardless of the source ones.
The activity of Faults, Horizons, FaultBlocks and StratigraphicUnits is
now copied, as OpenGeode does for mesh and collection components.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
StructuralModelBuilder::copy and CrossSectionBuilder::copy did not check
that the target model was empty, unlike BRepBuilder::copy and
SectionBuilder::copy, silently mixing copied components with existing
ones. They now throw when the target has any component, geological
components included, pointing to ModelConcatener.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…s flood fill

build_structural_model_fault_blocks tracked visited blocks in a vector
searched linearly (quadratic in the number of blocks) and, for each
block boundary, scanned the items of every fault to know whether the
surface was a fault. Visited blocks and fault surfaces are now stored in
hash sets, the latter computed once. The unused treated_faults vector is
removed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ult block

Calling build_structural_model_fault_blocks on a model which already has
FaultBlocks (e.g. calling it twice) created new FaultBlocks for every
Block, so Blocks ended up in several FaultBlocks. Blocks already
belonging to a FaultBlock are now kept as is and ignored when building
the new FaultBlocks, with a warning, making the function idempotent.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… bound stack walks

add_above_relation now throws when the new relation would close a cycle
(or relate a component to itself). is_above, compute_top_and_bottom_horizons,
the ordered ranges and repair_horizon_stack_if_possible bound their walks
so that inconsistent relations can no longer cause infinite loops.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Corrupted files containing a cycle in above relations are repaired on load:
the relations closing a cycle are removed with a warning.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ve_relation

Adding "A above B" when "B above A" already existed silently kept the old
direction. The existing relation is now reversed (with a warning), as long
as it does not create a cycle.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…e/under

set_horizon_above and set_horizon_under now require the horizon and the
stratigraphic unit to belong to the stack, and replace (with a warning) the
previous component directly above/under instead of adding duplicated
relations that made above()/under() ambiguous.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ition

add_horizon_in_stratigraphic_unit, remove_horizon and
remove_stratigraphic_unit now recompute the top and bottom horizons when
they were already computed, instead of leaving stale (possibly removed)
horizons. compute_top_and_bottom_horizons resets them on an empty stack.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… stacks

The ordered ranges and string() dereferenced above()/under()/top_horizon()
optionals without checking them, throwing bad_optional_access on stacks
with missing units or gaps. Iteration now ends where the relations stop
and string() skips missing units.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…mes helpers

horizons_stack_from_bottom_to_top_names and
horizons_stack_from_top_to_bottom_names accessed units_names[0] out of
bounds when both lists were empty. An empty stack is now returned.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…tack_if_possible

Repairing a stack with no horizon threw bad_optional_access on the
missing bottom horizon; there is nothing to repair in that case.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Replace the private relation_edge scan (comparing component uuids around
a vertex) by the base relation_edge_index, which compares vertex indices
around the lowest degree vertex. remove_above_relation no longer performs
a redundant second lookup since the lookup is undirected.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
BotellaA and others added 19 commits October 22, 2026 09:49
… initial model and BRep

The ImplicitStructuralModel( initial, BRep&&, mappings ) and
ImplicitCrossSection( initial, Section&&, mappings ) constructors always
created a new implicit attribute with a random id, so implicit values
carried by the new meshes under the initial model implicit attribute
(e.g. remeshed copies) were lost and a duplicated geode_implicit_attribute
was left. When the new meshes carry the initial implicit attribute, its id
is now adopted; otherwise the behavior is unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ng in noexcept constructors

Converting constructors of StratigraphicModel and StratigraphicSection were
noexcept but threw when a Block (resp. Surface) was not meshed as a
TetrahedralSolid (resp. TriangulatedSurface), calling std::terminate.
Such components are now skipped, consistently with ImplicitStructuralModel,
the converting constructors are no longer noexcept and the move
constructors no longer re-initialize the stratigraphic queries.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
stratigraphic_containing_polyhedron (resp. polygon) evaluated the
distance to the element returned by the AABB tree even when the tree
was empty (NO_ID), leading to out of bounds accesses. The distance
returned by the tree is now reused and NO_ID gives std::nullopt.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…tion

Stratigraphic location functions and AABB trees were only added with
try_emplace, so entries of removed blocks (resp. surfaces) or of replaced
meshes were kept forever: stratigraphic_bounding_box() threw on removed
components and functions could reference deleted meshes. Both caches are
now cleared before being rebuilt.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…omponent

Stratigraphic coordinates were fetched through two hash map lookups per
vertex in hot loops (AABB tree creation, distance callbacks evaluating
8 lookups per element, stratigraphic surfaces and lines). The location
function and the implicit attribute are now resolved once per block
(resp. surface) and reused.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…tices

stratigraphic_bounding_box() built a full stratigraphic AABB tree per
block (resp. surface) only to read its root box, and threw on empty
meshes. The box is now computed directly from the stratigraphic
coordinates of the element vertices, empty components are ignored.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…_implicit_model_and_coords

The stratigraphic locations were written in a new attribute with a random
id, while the created StratigraphicModel uses its own stratigraphic
location attribute: all locations were zero. They are now set through
the StratigraphicModelBuilder once the model is created.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Stratigraphic coordinates are now computed once per vertex instead of
once per tetrahedron vertex, a single summary is logged instead of one
message per invalid tetrahedron, and blocks not meshed as
TetrahedralSolid are skipped instead of throwing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
StratigraphicSectionBuilder::copy never copied the stratigraphic
locations: all the copied locations were zero. A
copy_stratigraphic_attribute_values method, mirroring the 3D builder,
now copies them and removes the stale attribute copied with the meshes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ations in copy

copy_stratigraphic_attribute_values threw on blocks without stratigraphic
location attribute (e.g. blocks not meshed as TetrahedralSolid) and kept
the stale attribute copied with the meshes. Such blocks are now skipped
and the copied attribute is removed once its values are transferred.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…obust

import_old_stratigraphic_attribute_values_from_attribute_name threw on
blocks (resp. surfaces) without the old attribute, could pick the
model's own attribute when it shares the same name, never removed the
old attribute in 3D and did not reset the stratigraphic query trees.
Components without the old attribute are now skipped, the model's own
attribute is never used as source nor deleted, old attributes are
removed after import and the query trees are reinitialized.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…igning blocks to units

complete_stratigraphic_unit_block_relationships dereferenced the
optional units above/under horizons without checking them, throwing
std::bad_optional_access for model horizons missing from the
HorizonsStack or for top/bottom horizons without unit beyond them.
Horizons missing from the stack are now ignored and missing units
prevent the assignment instead of throwing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…reated when assigning blocks

complete_stratigraphic_unit_block_relationships removed, from a
destructor also run during stack unwinding, every empty stratigraphic
unit of the model, including the ones created by the user. Only the
units created from the HorizonsStack and still empty are now removed,
explicitly at the end of the assignment (or before rethrowing).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…rizon and an older erosion or a younger baselap

When a block is bounded by one conformal horizon and one erosion (resp.
baselap), the second case tested is_directly_above(above(conformal),
erosion) (resp. is_directly_above(above(baselap), conformal)), which can
never be true. Blocks between an erosion below and a conformal horizon
above are now assigned to the unit under the conformal horizon, and
blocks between a conformal horizon below and a baselap above to the unit
above the conformal horizon, symmetrically to the existing cases.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…an two conformal horizons from an arbitrary one

Blocks bounded by more than two conformal horizons were processed as if
they had a single one, using an arbitrary conformal horizon with an
erosion or a baselap and possibly assigning a wrong unit. Such ambiguous
blocks are now only assigned through their neighbors.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…atigraphic units

The fixed-point loop rescanned every block, and recollected the horizons
of all its boundaries, at each pass until no block was assigned anymore,
which is quadratic for propagation chains. Only the unassigned neighbors
of newly assigned blocks are now reprocessed, assigned blocks are kept
in a hash set and the horizon boundaries of each block are cached.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
clone() rebuilt the model from a cloned ImplicitStructuralModel, so the
clone used a new stratigraphic location attribute (all zeros) next to
the copied one with the same name. The copied values are now
transferred to the clone attribute and the copied attribute is removed,
for both StratigraphicModel and StratigraphicSection.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… a modified BRep

The constructors from an initial model and a modified BRep (resp.
Section) created a new stratigraphic location attribute (all zeros) next
to the one carried by the new meshes. The locations stored with the
initial model attribute id are now transferred and the stale attribute
removed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… blocks or stratigraphic units

FaultBlocks and StratigraphicUnits were added after the first StructuralModel
and CrossSection files were written: loading those files logged a missing
file warning for each of these collections.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@BotellaA
BotellaA requested a review from BenPinet October 22, 2026 08:07
BotellaA and others added 2 commits October 22, 2026 08:08
…thon builder methods

pybind11 signatures of add_horizon_in_stratigraphic_unit referenced the C++
type name because InsertedHorizonInfo was registered afterwards, which made
pybind11-stubgen fail when generating the wheel stubs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Cpp-Linter Report ⚠️

Some files did not pass the configured checks!

clang-tidy (v21.1.8) reports: 745 concern(s)
  • bindings/python/src/explicit/mixin/builder/fault_blocks_builder.hpp:42:39: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       42 |     void define_fault_blocks_builder( pybind11::module& module )
          |                                       ^
  • bindings/python/src/explicit/mixin/builder/fault_blocks_builder.hpp:44:9: error: [clang-diagnostic-error]

    unexpected type name 'FaultBlocksBuilder2D': expected expression

       44 |         PYTHON_FAULT_BLOCKS_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/fault_blocks_builder.hpp:31:23: note: expanded from macro 'PYTHON_FAULT_BLOCKS_BUILDER'
       31 |     pybind11::class_< FaultBlocksBuilder##dimension##D >(                      \
          |                       ^
    note: expanded from here
  • bindings/python/src/explicit/mixin/builder/fault_blocks_builder.hpp:44:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       44 |         PYTHON_FAULT_BLOCKS_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/fault_blocks_builder.hpp:31:5: note: expanded from macro 'PYTHON_FAULT_BLOCKS_BUILDER'
       31 |     pybind11::class_< FaultBlocksBuilder##dimension##D >(                      \
          |     ^
  • bindings/python/src/explicit/mixin/builder/fault_blocks_builder.hpp:45:9: error: [clang-diagnostic-error]

    unexpected type name 'FaultBlocksBuilder3D': expected expression

       45 |         PYTHON_FAULT_BLOCKS_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/fault_blocks_builder.hpp:31:23: note: expanded from macro 'PYTHON_FAULT_BLOCKS_BUILDER'
       31 |     pybind11::class_< FaultBlocksBuilder##dimension##D >(                      \
          |                       ^
    note: expanded from here
  • bindings/python/src/explicit/mixin/builder/fault_blocks_builder.hpp:45:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       45 |         PYTHON_FAULT_BLOCKS_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/fault_blocks_builder.hpp:31:5: note: expanded from macro 'PYTHON_FAULT_BLOCKS_BUILDER'
       31 |     pybind11::class_< FaultBlocksBuilder##dimension##D >(                      \
          |     ^
  • bindings/python/src/explicit/mixin/builder/faults_builder.hpp:43:33: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       43 |     void define_faults_builder( pybind11::module& module )
          |                                 ^
  • bindings/python/src/explicit/mixin/builder/faults_builder.hpp:45:9: error: [clang-diagnostic-error]

    unexpected type name 'FaultsBuilder2D': expected expression

       45 |         PYTHON_FAULTS_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/faults_builder.hpp:31:23: note: expanded from macro 'PYTHON_FAULTS_BUILDER'
       31 |     pybind11::class_< FaultsBuilder##dimension##D >(                           \
          |                       ^
    note: expanded from here
  • bindings/python/src/explicit/mixin/builder/faults_builder.hpp:45:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       45 |         PYTHON_FAULTS_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/faults_builder.hpp:31:5: note: expanded from macro 'PYTHON_FAULTS_BUILDER'
       31 |     pybind11::class_< FaultsBuilder##dimension##D >(                           \
          |     ^
  • bindings/python/src/explicit/mixin/builder/faults_builder.hpp:46:9: error: [clang-diagnostic-error]

    unexpected type name 'FaultsBuilder3D': expected expression

       46 |         PYTHON_FAULTS_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/faults_builder.hpp:31:23: note: expanded from macro 'PYTHON_FAULTS_BUILDER'
       31 |     pybind11::class_< FaultsBuilder##dimension##D >(                           \
          |                       ^
    note: expanded from here
  • bindings/python/src/explicit/mixin/builder/faults_builder.hpp:46:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       46 |         PYTHON_FAULTS_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/faults_builder.hpp:31:5: note: expanded from macro 'PYTHON_FAULTS_BUILDER'
       31 |     pybind11::class_< FaultsBuilder##dimension##D >(                           \
          |     ^
  • bindings/python/src/explicit/mixin/builder/horizons_builder.hpp:45:35: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       45 |     void define_horizons_builder( pybind11::module& module )
          |                                   ^
  • bindings/python/src/explicit/mixin/builder/horizons_builder.hpp:47:9: error: [clang-diagnostic-error]

    unexpected type name 'HorizonsBuilder2D': expected expression

       47 |         PYTHON_HORIZONS_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/horizons_builder.hpp:31:23: note: expanded from macro 'PYTHON_HORIZONS_BUILDER'
       31 |     pybind11::class_< HorizonsBuilder##dimension##D >(                         \
          |                       ^
    note: expanded from here
  • bindings/python/src/explicit/mixin/builder/horizons_builder.hpp:47:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       47 |         PYTHON_HORIZONS_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/horizons_builder.hpp:31:5: note: expanded from macro 'PYTHON_HORIZONS_BUILDER'
       31 |     pybind11::class_< HorizonsBuilder##dimension##D >(                         \
          |     ^
  • bindings/python/src/explicit/mixin/builder/horizons_builder.hpp:48:9: error: [clang-diagnostic-error]

    unexpected type name 'HorizonsBuilder3D': expected expression

       48 |         PYTHON_HORIZONS_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/horizons_builder.hpp:31:23: note: expanded from macro 'PYTHON_HORIZONS_BUILDER'
       31 |     pybind11::class_< HorizonsBuilder##dimension##D >(                         \
          |                       ^
    note: expanded from here
  • bindings/python/src/explicit/mixin/builder/horizons_builder.hpp:48:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       48 |         PYTHON_HORIZONS_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/horizons_builder.hpp:31:5: note: expanded from macro 'PYTHON_HORIZONS_BUILDER'
       31 |     pybind11::class_< HorizonsBuilder##dimension##D >(                         \
          |     ^
  • bindings/python/src/explicit/mixin/builder/stratigraphic_units_builder.hpp:44:46: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       44 |     void define_stratigraphic_units_builder( pybind11::module& module )
          |                                              ^
  • bindings/python/src/explicit/mixin/builder/stratigraphic_units_builder.hpp:46:9: error: [clang-diagnostic-error]

    unexpected type name 'StratigraphicUnitsBuilder2D': expected expression

       46 |         PYTHON_STRATIGRAPHIC_UNITS_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/stratigraphic_units_builder.hpp:31:23: note: expanded from macro 'PYTHON_STRATIGRAPHIC_UNITS_BUILDER'
       31 |     pybind11::class_< StratigraphicUnitsBuilder##dimension##D >(               \
          |                       ^
    note: expanded from here
  • bindings/python/src/explicit/mixin/builder/stratigraphic_units_builder.hpp:46:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       46 |         PYTHON_STRATIGRAPHIC_UNITS_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/stratigraphic_units_builder.hpp:31:5: note: expanded from macro 'PYTHON_STRATIGRAPHIC_UNITS_BUILDER'
       31 |     pybind11::class_< StratigraphicUnitsBuilder##dimension##D >(               \
          |     ^
  • bindings/python/src/explicit/mixin/builder/stratigraphic_units_builder.hpp:47:9: error: [clang-diagnostic-error]

    unexpected type name 'StratigraphicUnitsBuilder3D': expected expression

       47 |         PYTHON_STRATIGRAPHIC_UNITS_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/stratigraphic_units_builder.hpp:31:23: note: expanded from macro 'PYTHON_STRATIGRAPHIC_UNITS_BUILDER'
       31 |     pybind11::class_< StratigraphicUnitsBuilder##dimension##D >(               \
          |                       ^
    note: expanded from here
  • bindings/python/src/explicit/mixin/builder/stratigraphic_units_builder.hpp:47:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       47 |         PYTHON_STRATIGRAPHIC_UNITS_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/explicit/mixin/builder/stratigraphic_units_builder.hpp:31:5: note: expanded from macro 'PYTHON_STRATIGRAPHIC_UNITS_BUILDER'
       31 |     pybind11::class_< StratigraphicUnitsBuilder##dimension##D >(               \
          |     ^
  • bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:88:41: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       88 |     void define_horizons_stack_builder( pybind11::module& module )
          |                                         ^
  • bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:90:9: warning: [bugprone-unused-local-non-trivial-variable]

    unused local variable 'name2' of type 'const basic_string<char, std::char_traits, std::allocator>'

       90 |         PYTHON_HORIZONS_STACK_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:45:16: note: expanded from macro 'PYTHON_HORIZONS_STACK_BUILDER'
       45 |     const auto name##dimension =                                               \
          |                ^
    note: expanded from here
  • bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:90:9: error: [clang-diagnostic-error]

    expected '(' for function-style cast or type construction

       90 |         PYTHON_HORIZONS_STACK_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:34:65: note: expanded from macro 'PYTHON_HORIZONS_STACK_BUILDER'
       34 |         HorizonsStackBuilder##dimension##D::InsertedHorizonInfo >(             \
          |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
  • bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:90:9: error: [clang-diagnostic-error]

    unexpected type name 'HorizonsStackBuilder2D': expected expression

       90 |         PYTHON_HORIZONS_STACK_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:47:23: note: expanded from macro 'PYTHON_HORIZONS_STACK_BUILDER'
       47 |     pybind11::class_< HorizonsStackBuilder##dimension##D,                      \
          |                       ^
    note: expanded from here
  • bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:90:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       90 |         PYTHON_HORIZONS_STACK_BUILDER( 2 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:33:5: note: expanded from macro 'PYTHON_HORIZONS_STACK_BUILDER'
       33 |     pybind11::class_<                                                          \
          |     ^
  • bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:91:9: warning: [bugprone-unused-local-non-trivial-variable]

    unused local variable 'name3' of type 'const basic_string<char, std::char_traits, std::allocator>'

       91 |         PYTHON_HORIZONS_STACK_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:45:16: note: expanded from macro 'PYTHON_HORIZONS_STACK_BUILDER'
       45 |     const auto name##dimension =                                               \
          |                ^
    note: expanded from here
  • bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:91:9: error: [clang-diagnostic-error]

    expected '(' for function-style cast or type construction

       91 |         PYTHON_HORIZONS_STACK_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:34:65: note: expanded from macro 'PYTHON_HORIZONS_STACK_BUILDER'
       34 |         HorizonsStackBuilder##dimension##D::InsertedHorizonInfo >(             \
          |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
  • bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:91:9: error: [clang-diagnostic-error]

    unexpected type name 'HorizonsStackBuilder3D': expected expression

       91 |         PYTHON_HORIZONS_STACK_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:47:23: note: expanded from macro 'PYTHON_HORIZONS_STACK_BUILDER'
       47 |     pybind11::class_< HorizonsStackBuilder##dimension##D,                      \
          |                       ^
    note: expanded from here
  • bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:91:9: error: [clang-diagnostic-error]

    use of undeclared identifier 'pybind11'

       91 |         PYTHON_HORIZONS_STACK_BUILDER( 3 );
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/bindings/python/src/implicit/representation/builder/horizons_stack_builder.hpp:33:5: note: expanded from macro 'PYTHON_HORIZONS_STACK_BUILDER'
       33 |     pybind11::class_<                                                          \
          |     ^
  • include/geode/geosciences/explicit/geometry/geographic_coordinate_system.hpp:41:47: warning: [cppcoreguidelines-special-member-functions]

    class 'GeographicCoordinateSystemInfo' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator

       41 |     struct opengeode_geosciences_explicit_api GeographicCoordinateSystemInfo
          |                                               ^
  • include/geode/geosciences/explicit/geometry/geographic_coordinate_system.hpp:64:36: warning: [readability-identifier-length]

    parameter name 'a' is too short, expected at least 3 characters

       64 |                     { []( Archive& a, GeographicCoordinateSystemInfo& info ) {
          |                                    ^
  • include/geode/geosciences/explicit/geometry/geographic_coordinate_system.hpp:77:11: warning: [cppcoreguidelines-special-member-functions]

    class 'GeographicCoordinateSystem' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator

       77 |     class GeographicCoordinateSystem
          |           ^
  • include/geode/geosciences/explicit/geometry/geographic_coordinate_system.hpp:129:48: warning: [cppcoreguidelines-special-member-functions]

    class 'GeographicCoordinateTransformation' defines a destructor and a move constructor but does not define a copy constructor, a copy assignment operator or a move assignment operator

      129 |             opengeode_geosciences_explicit_api GeographicCoordinateTransformation
          |                                                ^
  • include/geode/geosciences/explicit/geometry/geographic_coordinate_system.hpp:134:55: warning: [readability-identifier-length]

    parameter name 'to' is too short, expected at least 3 characters

      134 |                 const GeographicCoordinateSystemInfo& to );
          |                                                       ^
  • include/geode/geosciences/explicit/mixin/core/fault.hpp:46:11: warning: [cppcoreguidelines-special-member-functions]

    class 'Fault' defines a destructor, a copy constructor, a copy assignment operator and a move constructor but does not define a move assignment operator

       46 |     class Fault final : public Component< dimension >
          |           ^
  • include/geode/geosciences/explicit/mixin/core/fault.hpp:55:21: warning: [performance-enum-size]

    enum 'FAULT_TYPE' uses a larger base type ('int', size: 4 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size

       55 |         enum struct FAULT_TYPE
          |                     ^
  • include/geode/geosciences/explicit/mixin/core/fault.hpp:85:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       85 |         Fault( FaultsKey ) : Fault() {}
          |         ^
          |         explicit 
  • include/geode/geosciences/explicit/mixin/core/fault.hpp:85:26: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       85 |         Fault( FaultsKey ) : Fault() {}
          |                          ^
          |                           /*unused*/
  • include/geode/geosciences/explicit/mixin/core/fault.hpp:86:43: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       86 |         Fault( FAULT_TYPE type, FaultsKey ) : Fault( type ) {}
          |                                           ^
          |                                            /*unused*/
  • include/geode/geosciences/explicit/mixin/core/fault.hpp:90:70: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       90 |         void set_fault_name( std::string_view name, FaultsBuilderKey )
          |                                                                      ^
          |                                                                       /*unused*/
  • include/geode/geosciences/explicit/mixin/core/fault.hpp:95:62: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       95 |         void set_fault_active( bool active, FaultsBuilderKey )
          |                                                              ^
          |                                                               /*unused*/
  • include/geode/geosciences/explicit/mixin/core/fault_block.hpp:44:11: warning: [cppcoreguidelines-special-member-functions]

    class 'FaultBlock' defines a destructor, a copy constructor, a copy assignment operator and a move constructor but does not define a move assignment operator

       44 |     class FaultBlock final : public Component< dimension >
          |           ^
  • include/geode/geosciences/explicit/mixin/core/fault_block.hpp:67:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       67 |         FaultBlock( FaultBlocksKey ) : FaultBlock() {};
          |         ^
          |         explicit 
  • include/geode/geosciences/explicit/mixin/core/fault_block.hpp:67:36: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       67 |         FaultBlock( FaultBlocksKey ) : FaultBlock() {};
          |                                    ^
          |                                     /*unused*/
  • include/geode/geosciences/explicit/mixin/core/fault_block.hpp:70:58: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       70 |             std::string_view name, FaultBlocksBuilderKey )
          |                                                          ^
          |                                                           /*unused*/
  • include/geode/geosciences/explicit/mixin/core/fault_block.hpp:75:73: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       75 |         void set_fault_block_active( bool active, FaultBlocksBuilderKey )
          |                                                                         ^
          |                                                                          /*unused*/
  • include/geode/geosciences/explicit/mixin/core/horizon.hpp:46:11: warning: [cppcoreguidelines-special-member-functions]

    class 'Horizon' defines a destructor, a copy constructor, a copy assignment operator and a move constructor but does not define a move assignment operator

       46 |     class Horizon final : public Component< dimension >
          |           ^
  • include/geode/geosciences/explicit/mixin/core/horizon.hpp:55:21: warning: [performance-enum-size]

    enum 'CONTACT_TYPE' uses a larger base type ('int', size: 4 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size

       55 |         enum struct CONTACT_TYPE
          |                     ^
  • include/geode/geosciences/explicit/mixin/core/horizon.hpp:83:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       83 |         Horizon( HorizonsKey ) : Horizon() {}
          |         ^
          |         explicit 
  • include/geode/geosciences/explicit/mixin/core/horizon.hpp:83:30: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       83 |         Horizon( HorizonsKey ) : Horizon() {}
          |                              ^
          |                               /*unused*/
  • include/geode/geosciences/explicit/mixin/core/horizon.hpp:84:49: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       84 |         Horizon( CONTACT_TYPE type, HorizonsKey ) : Horizon( type ) {}
          |                                                 ^
          |                                                  /*unused*/
  • include/geode/geosciences/explicit/mixin/core/horizon.hpp:88:74: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       88 |         void set_horizon_name( std::string_view name, HorizonsBuilderKey )
          |                                                                          ^
          |                                                                           /*unused*/
  • include/geode/geosciences/explicit/mixin/core/horizon.hpp:93:66: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       93 |         void set_horizon_active( bool active, HorizonsBuilderKey )
          |                                                                  ^
          |                                                                   /*unused*/
  • include/geode/geosciences/explicit/mixin/core/stratigraphic_unit.hpp:43:11: warning: [cppcoreguidelines-special-member-functions]

    class 'StratigraphicUnit' defines a destructor, a copy constructor, a copy assignment operator and a move constructor but does not define a move assignment operator

       43 |     class StratigraphicUnit final : public Component< dimension >
          |           ^
  • include/geode/geosciences/explicit/mixin/core/stratigraphic_unit.hpp:67:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       67 |         StratigraphicUnit( StratigraphicUnitsKey ) : StratigraphicUnit() {}
          |         ^
          |         explicit 
  • include/geode/geosciences/explicit/mixin/core/stratigraphic_unit.hpp:67:50: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       67 |         StratigraphicUnit( StratigraphicUnitsKey ) : StratigraphicUnit() {}
          |                                                  ^
          |                                                   /*unused*/
  • include/geode/geosciences/explicit/mixin/core/stratigraphic_unit.hpp:70:65: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       70 |             std::string_view name, StratigraphicUnitsBuilderKey )
          |                                                                 ^
          |                                                                  /*unused*/
  • include/geode/geosciences/explicit/mixin/core/stratigraphic_unit.hpp:76:55: warning: [hicpp-named-parameter]

    all parameters should be named in a function

       76 |             bool active, StratigraphicUnitsBuilderKey )
          |                                                       ^
          |                                                        /*unused*/
  • include/geode/geosciences/explicit/representation/builder/detail/copy.hpp:32:1: warning: [modernize-concat-nested-namespaces]

    nested namespaces can be concatenated

       32 | namespace geode
          | ^~~~~~~~~~~~~~~
       33 | {
          | ~
       34 |     namespace detail
          |     ~~~~~~~~~~~~~~~~
          |     namespace geode::detail
  • include/geode/geosciences/explicit/representation/builder/detail/copy.hpp:204:14: warning: [readability-function-size]

    function 'copy_collection_item_relationships' exceeds recommended size/complexity thresholds

      204 |         void copy_collection_item_relationships( const ModelFrom& from,
          |              ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/include/geode/geosciences/explicit/representation/builder/detail/copy.hpp:204:14: note: 5 parameters (threshold 4)
  • include/geode/geosciences/explicit/representation/core/cross_section.hpp:55:46: warning: [cppcoreguidelines-special-member-functions]

    class 'CrossSection' defines a move constructor but does not define a destructor, a copy constructor, a copy assignment operator or a move assignment operator

       55 |     class opengeode_geosciences_explicit_api CrossSection
          |                                              ^
  • include/geode/geosciences/explicit/representation/core/cross_section.hpp:63:50: warning: [cppcoreguidelines-special-member-functions]

    class 'HorizonItemRange' defines a destructor and a copy constructor but does not define a copy assignment operator, a move constructor or a move assignment operator

       63 |         class opengeode_geosciences_explicit_api HorizonItemRange
          |                                                  ^
  • include/geode/geosciences/explicit/representation/core/cross_section.hpp:84:50: warning: [cppcoreguidelines-special-member-functions]

    class 'FaultItemRange' defines a destructor and a copy constructor but does not define a copy assignment operator, a move constructor or a move assignment operator

       84 |         class opengeode_geosciences_explicit_api FaultItemRange
          |                                                  ^
  • include/geode/geosciences/explicit/representation/core/cross_section.hpp:105:50: warning: [cppcoreguidelines-special-member-functions]

    class 'FaultBlockItemRange' defines a destructor and a copy constructor but does not define a copy assignment operator, a move constructor or a move assignment operator

      105 |         class opengeode_geosciences_explicit_api FaultBlockItemRange
          |                                                  ^
  • include/geode/geosciences/explicit/representation/core/cross_section.hpp:126:50: warning: [cppcoreguidelines-special-member-functions]

    class 'StratigraphicUnitItemRange' defines a destructor and a copy constructor but does not define a copy assignment operator, a move constructor or a move assignment operator

      126 |         class opengeode_geosciences_explicit_api StratigraphicUnitItemRange
          |                                                  ^
  • include/geode/geosciences/explicit/representation/core/cross_section.hpp:159:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

      159 |         CrossSection( BITSERY );
          |         ^
          |         explicit 
  • include/geode/geosciences/explicit/representation/core/cross_section.hpp:168:65: warning: [readability-identifier-length]

    parameter name 'id' is too short, expected at least 3 characters

      168 |         [[nodiscard]] const Component2D& component( const uuid& id ) const;
          |                                                                 ^
  • include/geode/geosciences/explicit/representation/core/detail/clone.hpp:36:1: warning: [modernize-concat-nested-namespaces]

    nested namespaces can be concatenated

       36 | namespace geode
          | ^~~~~~~~~~~~~~~
       37 | {
          | ~
       38 |     namespace detail
          |     ~~~~~~~~~~~~~~~~
          |     namespace geode::detail
  • include/geode/geosciences/explicit/representation/core/detail/helpers.hpp:37:1: warning: [modernize-concat-nested-namespaces]

    nested namespaces can be concatenated

       37 | namespace geode
          | ^~~~~~~~~~~~~~~
       38 | {
          | ~
       39 |     namespace detail
          |     ~~~~~~~~~~~~~~~~
          |     namespace geode::detail
  • include/geode/geosciences/explicit/representation/core/detail/helpers.hpp:50:29: warning: [misc-redundant-expression]

    both sides of overloaded operator are equivalent

       50 |             while( iterator != iterator && ( *iterator ).type != item_type )
          |                             ^
  • include/geode/geosciences/explicit/representation/core/structural_model.hpp:58:46: warning: [cppcoreguidelines-special-member-functions]

    class 'StructuralModel' defines a move constructor but does not define a destructor, a copy constructor, a copy assignment operator or a move assignment operator

       58 |     class opengeode_geosciences_explicit_api StructuralModel
          |                                              ^
  • include/geode/geosciences/explicit/representation/core/structural_model.hpp:66:50: warning: [cppcoreguidelines-special-member-functions]

    class 'HorizonItemRange' defines a destructor and a copy constructor but does not define a copy assignment operator, a move constructor or a move assignment operator

       66 |         class opengeode_geosciences_explicit_api HorizonItemRange
          |                                                  ^
  • include/geode/geosciences/explicit/representation/core/structural_model.hpp:87:50: warning: [cppcoreguidelines-special-member-functions]

    class 'FaultItemRange' defines a destructor and a copy constructor but does not define a copy assignment operator, a move constructor or a move assignment operator

       87 |         class opengeode_geosciences_explicit_api FaultItemRange
          |                                                  ^
  • include/geode/geosciences/explicit/representation/core/structural_model.hpp:108:50: warning: [cppcoreguidelines-special-member-functions]

    class 'FaultBlockItemRange' defines a destructor and a copy constructor but does not define a copy assignment operator, a move constructor or a move assignment operator

      108 |         class opengeode_geosciences_explicit_api FaultBlockItemRange
          |                                                  ^
  • include/geode/geosciences/explicit/representation/core/structural_model.hpp:129:50: warning: [cppcoreguidelines-special-member-functions]

    class 'StratigraphicUnitItemRange' defines a destructor and a copy constructor but does not define a copy assignment operator, a move constructor or a move assignment operator

      129 |         class opengeode_geosciences_explicit_api StratigraphicUnitItemRange
          |                                                  ^
  • include/geode/geosciences/explicit/representation/core/structural_model.hpp:162:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

      162 |         StructuralModel( BITSERY );
          |         ^
          |         explicit 
  • include/geode/geosciences/explicit/representation/core/structural_model.hpp:171:65: warning: [readability-identifier-length]

    parameter name 'id' is too short, expected at least 3 characters

      171 |         [[nodiscard]] const Component3D& component( const uuid& id ) const;
          |                                                                 ^
  • include/geode/geosciences/implicit/representation/builder/horizons_stack_builder.hpp:52:11: warning: [cppcoreguidelines-special-member-functions]

    class 'HorizonsStackBuilder' defines a copy constructor, a copy assignment operator and a move constructor but does not define a destructor or a move assignment operator

       52 |     class HorizonsStackBuilder : public StratigraphicRelationshipsBuilder,
          |           ^
  • include/geode/geosciences/implicit/representation/core/implicit_cross_section.hpp:51:46: warning: [cppcoreguidelines-special-member-functions]

    class 'ImplicitCrossSection' defines a destructor and a move constructor but does not define a copy constructor, a copy assignment operator or a move assignment operator

       51 |     class opengeode_geosciences_implicit_api ImplicitCrossSection
          |                                              ^
  • include/geode/geosciences/implicit/representation/core/implicit_cross_section.hpp:60:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       60 |         ImplicitCrossSection( BITSERY );
          |         ^
          |         explicit 
  • include/geode/geosciences/implicit/representation/core/implicit_cross_section.hpp:70:65: warning: [readability-identifier-length]

    parameter name 'id' is too short, expected at least 3 characters

       70 |         [[nodiscard]] const Component2D& component( const uuid& id ) const;
          |                                                                 ^
  • include/geode/geosciences/implicit/representation/core/implicit_structural_model.hpp:56:46: warning: [cppcoreguidelines-special-member-functions]

    class 'ImplicitStructuralModel' defines a destructor and a move constructor but does not define a copy constructor, a copy assignment operator or a move assignment operator

       56 |     class opengeode_geosciences_implicit_api ImplicitStructuralModel
          |                                              ^
  • include/geode/geosciences/implicit/representation/core/implicit_structural_model.hpp:66:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       66 |         ImplicitStructuralModel( BITSERY );
          |         ^
          |         explicit 
  • include/geode/geosciences/implicit/representation/core/implicit_structural_model.hpp:77:65: warning: [readability-identifier-length]

    parameter name 'id' is too short, expected at least 3 characters

       77 |         [[nodiscard]] const Component3D& component( const uuid& id ) const;
          |                                                                 ^
  • include/geode/geosciences/implicit/representation/core/stratigraphic_model.hpp:50:46: warning: [cppcoreguidelines-special-member-functions]

    class 'StratigraphicModel' defines a destructor and a move constructor but does not define a copy constructor, a copy assignment operator or a move assignment operator

       50 |     class opengeode_geosciences_implicit_api StratigraphicModel
          |                                              ^
  • include/geode/geosciences/implicit/representation/core/stratigraphic_model.hpp:62:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       62 |         StratigraphicModel( BITSERY );
          |         ^
          |         explicit 
  • include/geode/geosciences/implicit/representation/core/stratigraphic_model.hpp:70:9: warning: [cppcoreguidelines-explicit-virtual-functions]

    annotate this function with 'override' or (rarely) 'final'

       70 |         ~StratigraphicModel();
          |         ^                    
          |                               override
  • include/geode/geosciences/implicit/representation/core/stratigraphic_model.hpp:74:65: warning: [readability-identifier-length]

    parameter name 'id' is too short, expected at least 3 characters

       74 |         [[nodiscard]] const Component3D& component( const uuid& id ) const;
          |                                                                 ^
  • include/geode/geosciences/implicit/representation/core/stratigraphic_section.hpp:53:46: warning: [cppcoreguidelines-special-member-functions]

    class 'StratigraphicSection' defines a destructor and a move constructor but does not define a copy constructor, a copy assignment operator or a move assignment operator

       53 |     class opengeode_geosciences_implicit_api StratigraphicSection
          |                                              ^
  • include/geode/geosciences/implicit/representation/core/stratigraphic_section.hpp:65:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       65 |         StratigraphicSection( BITSERY );
          |         ^
          |         explicit 
  • include/geode/geosciences/implicit/representation/core/stratigraphic_section.hpp:74:9: warning: [cppcoreguidelines-explicit-virtual-functions]

    annotate this function with 'override' or (rarely) 'final'

       74 |         ~StratigraphicSection();
          |         ^                      
          |                                 override
  • include/geode/geosciences/implicit/representation/core/stratigraphic_section.hpp:78:65: warning: [readability-identifier-length]

    parameter name 'id' is too short, expected at least 3 characters

       78 |         [[nodiscard]] const Component2D& component( const uuid& id ) const;
          |                                                                 ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:61:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       61 |         Impl( GeographicCoordinateSystemInfo info ) : info_{ std::move( info ) }
          |         ^
          |         explicit 
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:61:46: warning: [performance-unnecessary-value-param]

    the parameter 'info' is copied for each invocation but only used as a const reference; consider making it a const reference

       61 |         Impl( GeographicCoordinateSystemInfo info ) : info_{ std::move( info ) }
          |                                              ^
          |               const                         &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:61:62: warning: [hicpp-move-const-arg]

    passing result of std::move() as a const reference argument; no move will actually happen

       61 |         Impl( GeographicCoordinateSystemInfo info ) : info_{ std::move( info ) }
          |                                                              ^~~~~~~~~~      ~
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/include/geode/geosciences/explicit/geometry/geographic_coordinate_system.hpp:41:47: note: 'GeographicCoordinateSystemInfo' is not move assignable/constructible
       41 |     struct opengeode_geosciences_explicit_api GeographicCoordinateSystemInfo
          |                                               ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:67:9: warning: [modernize-use-nodiscard]

    function 'info' should be marked [[nodiscard]]

       67 |         const GeographicCoordinateSystemInfo& info() const
          |         ^
          |         [[nodiscard]] 
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:77:59: warning: [readability-identifier-length]

    parameter name 'a' is too short, expected at least 3 characters

       77 |                 Growable< Archive, Impl >{ { []( Archive& a, Impl& impl ) {
          |                                                           ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:125:39: warning: [readability-identifier-length]

    parameter name 'a' is too short, expected at least 3 characters

      125 |                        { []( Archive& a, GeographicCoordinateSystem& crs ) {
          |                                       ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:143:36: warning: [cppcoreguidelines-pro-bounds-pointer-arithmetic]

    do not use pointer arithmetic

      143 |             const auto* gdal_crs = gdal_list[i];
          |                                    ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:169:51: warning: [readability-identifier-length]

    parameter name 'to' is too short, expected at least 3 characters

      169 |             const GeographicCoordinateSystemInfo& to )
          |                                                   ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:186:9: warning: [modernize-use-nodiscard]

    function 'transform<2U>' should be marked [[nodiscard]]

      186 |         std::vector< Point< dimension > > transform(
          |         ^
          |         [[nodiscard]] 
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:186:9: warning: [modernize-use-nodiscard]

    function 'transform<3U>' should be marked [[nodiscard]]

      186 |         std::vector< Point< dimension > > transform(
          |         ^
          |         [[nodiscard]] 
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system.cpp:253:51: warning: [readability-identifier-length]

    parameter name 'to' is too short, expected at least 3 characters

      253 |             const GeographicCoordinateSystemInfo& to )
          |                                                   ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:63:58: warning: [readability-identifier-length]

    parameter name 'to' is too short, expected at least 3 characters

       63 |             const geode::GeographicCoordinateSystemInfo& to )
          |                                                          ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:72:24: warning: [readability-identifier-length]

    variable name 'it' is too short, expected at least 3 characters

       72 |             const auto it = transformations_.find( authority_code );
          |                        ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:124:10: warning: [readability-function-size]

    function 'apply_coordinate_reference_system' exceeds recommended size/complexity thresholds

      124 |     void apply_coordinate_reference_system( const Mesh& mesh,
          |          ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:124:10: note: 5 parameters (threshold 4)
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:127:47: warning: [performance-unnecessary-value-param]

    the parameter 'info' is copied for each invocation but only used as a const reference; consider making it a const reference

      127 |         geode::GeographicCoordinateSystemInfo info,
          |                                               ^
          |         const                                &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:128:34: warning: [performance-unnecessary-value-param]

    the parameter 'coordinates' is copied for each invocation but only used as a const reference; consider making it a const reference

      128 |         Coordinates< Mesh::dim > coordinates )
          |                                  ^
          |         const                   &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:135:32: error: [clang-diagnostic-error]

    implicit instantiation of undefined template 'geode::Point<2>'

      135 |             crs->set_point( p, std::move( coordinates[p] ) );
          |                                ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:186:13: note: in instantiation of function template specialization '(anonymous namespace)::apply_coordinate_reference_system<geode::PointSet<2>>' requested here
      186 |             apply_coordinate_reference_system( component.mesh(), *builder,
          |             ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:494:9: note: in instantiation of function template specialization '(anonymous namespace)::apply_components_coordinate_reference_system<2U, geode::Corners<2>::CornerRange, (lambda at /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:496:13)>' requested here
      494 |         apply_components_coordinate_reference_system< 2 >(
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/OpenGeode-19.2.0-rc.1-ubuntu/include/geode/model/representation/builder/section_builder.hpp:50:42: note: template is declared here
       50 |     FORWARD_DECLARATION_DIMENSION_CLASS( Point );
          |                                          ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:135:32: error: [clang-diagnostic-error]

    implicit instantiation of undefined template 'geode::Point<3>'

      135 |             crs->set_point( p, std::move( coordinates[p] ) );
          |                                ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:186:13: note: in instantiation of function template specialization '(anonymous namespace)::apply_coordinate_reference_system<geode::PointSet<3>>' requested here
      186 |             apply_coordinate_reference_system( component.mesh(), *builder,
          |             ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:456:9: note: in instantiation of function template specialization '(anonymous namespace)::apply_components_coordinate_reference_system<3U, geode::Corners<3>::CornerRange, (lambda at /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:458:13)>' requested here
      456 |         apply_components_coordinate_reference_system< 3 >(
          |         ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/OpenGeode-19.2.0-rc.1-ubuntu/include/geode/model/representation/builder/brep_builder.hpp:55:42: note: template is declared here
       55 |     FORWARD_DECLARATION_DIMENSION_CLASS( Point );
          |                                          ^
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:159:15: warning: [performance-unnecessary-value-param]

    the parameter 'range' is copied for each invocation but only used as a const reference; consider making it a const reference

      159 |         Range range,
          |               ^
          |         const  &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:175:10: warning: [readability-function-size]

    function 'apply_components_coordinate_reference_system' exceeds recommended size/complexity thresholds

      175 |     void apply_components_coordinate_reference_system(
          |          ^
    /__w/OpenGeode-Geosciences/OpenGeode-Geosciences/src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:175:10: note: 5 parameters (threshold 4)
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:178:15: warning: [performance-unnecessary-value-param]

    the parameter 'range' is copied for each invocation but only used as a const reference; consider making it a const reference

      178 |         Range range,
          |               ^
          |         const  &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:234:63: error: [clang-diagnostic-error]

    no member named 'VariableAttribute' in namespace 'geode'

      234 |             attribute_manager.template find_attribute< geode::VariableAttribute,
          |                                                               ^~~~~~~~~~~~~~~~~
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:260:15: warning: [performance-unnecessary-value-param]

    the parameter 'range' is copied for each invocation but only used as a const reference; consider making it a const reference

      260 |         Range range, std::string_view crs_name )
          |               ^
          |         const  &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:275:15: warning: [performance-unnecessary-value-param]

    the parameter 'range' is copied for each invocation but only used as a const reference; consider making it a const reference

      275 |         Range range,
          |               ^
          |         const  &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:295:40: warning: [performance-unnecessary-value-param]

    the parameter 'info' is copied for each invocation but only used as a const reference; consider making it a const reference

      295 |         GeographicCoordinateSystemInfo info )
          |                                        ^
          |         const                         &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:306:40: warning: [performance-unnecessary-value-param]

    the parameter 'info' is copied for each invocation but only used as a const reference; consider making it a const reference

      306 |         GeographicCoordinateSystemInfo info )
          |                                        ^
          |         const                         &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:317:40: warning: [performance-unnecessary-value-param]

    the parameter 'info' is copied for each invocation but only used as a const reference; consider making it a const reference

      317 |         GeographicCoordinateSystemInfo info )
          |                                        ^
          |         const                         &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:328:40: warning: [performance-unnecessary-value-param]

    the parameter 'info' is copied for each invocation but only used as a const reference; consider making it a const reference

      328 |         GeographicCoordinateSystemInfo info )
          |                                        ^
          |         const                         &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:403:40: warning: [performance-unnecessary-value-param]

    the parameter 'info' is copied for each invocation but only used as a const reference; consider making it a const reference

      403 |         GeographicCoordinateSystemInfo info )
          |                                        ^
          |         const                         &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:414:40: warning: [performance-unnecessary-value-param]

    the parameter 'info' is copied for each invocation but only used as a const reference; consider making it a const reference

      414 |         GeographicCoordinateSystemInfo info )
          |                                        ^
          |         const                         &
  • src/geode/geosciences/explicit/geometry/geographic_coordinate_system_helper.cpp:425:40: warning: [performance-unnecessary-value-param]

    the parameter 'info' is copied for each invocation but only used as a const reference; consider making it a const reference

      425 |         GeographicCoordinateSystemInfo info )
          |                                        ^
          |         const                         &
  • src/geode/geosciences/explicit/mixin/core/fault.cpp:36:9: warning: [modernize-use-nodiscard]

    function 'type' should be marked [[nodiscard]]

       36 |         FAULT_TYPE type() const
          |         ^
          |         [[nodiscard]] 

Have any feedback or feature suggestions? Share it here.

BotellaA and others added 4 commits October 22, 2026 16:39
…oordinates test

stratigraphic_coordinates() returns by value and stratigraphic_location()
returns a reference into it: the test read a dangling reference, which
failed with GCC in Debug.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…existing fault blocks

Skipping Blocks already in a FaultBlock (c5ce8f9) broke Geode-DHI, which
rebuilds the FaultBlocks next to the existing ones and compares both sets to
detect splits and merges: the new set was empty and splits were missed.
Restore the previous behavior and document it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@BenPinet
BenPinet merged commit 6140473 into next Oct 22, 2026
25 checks passed
@BenPinet
BenPinet deleted the fix/robustness-performance-review branch October 22, 2026 17:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants