Commit Graph

6933 Commits

Author SHA1 Message Date
Pasukhin Dmitry
bfa0311ef0 Foundation Classes - Tree & collection performance optimizations, move semantics, unified map API (#1065)
NCollection_UBTree/EBTree:
- Add move constructor and move assignment operators
- Replace recursive Select() and delNode() with iterative stack-based
  traversal to avoid stack overflow on deeply unbalanced trees
- Optimize EBTree::Add() and Remove() to use single-lookup TryEmplaced()
  instead of double-lookup UnBind()+Bind() / Contains()+operator()
- Remove unused DEFINE_HUBTREE / DEFINE_HEBTREE / IMPLEMENT_HUBTREE /
  IMPLEMENT_HEBTREE macros
- Remove unused includes from EBTree (Standard_Type, Standard_Transient,
  NCollection_List, Standard_Integer, NCollection_Sequence)
- Fix doxygen @param tags and comment style

NCollection_LocalArray:
- Add move constructor and move assignment operators with optimized
  three-way branching (stack-stack copy, heap-heap swap, stack-heap steal)
- Add Reallocate() method supporting grow-with-copy for use as a
  dynamically growable stack
- Add static_assert enforcing trivially copyable element type

NCollection_CellFilter:
- Replace const_cast destructive-copy hack in Cell with proper move
  semantics; delete copy constructor and copy assignment
- Add Cell constructor from CellIndex for lightweight lookup keys
- Refactor add()/iterateAdd() to accept CellIndex instead of Cell,
  use TryEmplaced() for single-lookup cell insertion
- Refactor remove()/inspect() to use Contained() API with const_cast
  instead of C-style cast on Seek()
- Change ListNode default constructor from runtime throw to = delete
- Use size_t for dimension loops and add dimension size guard in IsEqual
- Remove SUN WorkShop 5.3 workaround
- Fix typo "usially" -> "usually" in class documentation

NCollection map API unification (Contained, TryEmplace, TryBind):
- Add Contained() to all map types returning std::optional with
  std::reference_wrapper; key-only maps return const key ref,
  data maps return std::pair of const key ref + value ref
- Add TryEmplace()/TryEmplaced() to NCollection_FlatMap and
  NCollection_IndexedMap for parity with NCollection_Map
- Add TryBind() to NCollection_IndexedDataMap for parity with
  NCollection_DataMap and NCollection_FlatDataMap
- Remove Seek()/ChangeSeek() from NCollection_Map (replaced by
  Contained())

Dead compiler workaround removal:
- NCollection_DefineAlloc: remove Borland/SUN #if branch, keep only
  the version with placement delete
- NCollection_SparseArrayBase: remove SUN WorkShop 5.3 workaround

GTests:
- Add move constructor/assignment tests for LocalArray, UBTree, EBTree
- Add Contained tests for NCollection_Map
- Add CellFilter tests and UBTree deep-unbalanced-tree stress test
2026-02-12 20:28:20 +00:00
Pasukhin Dmitry
f396c215e0 Data Exchange, STEP - Refactor pnindex handling in CreatePolyTriangulation (#1067)
Separate direct node indexing and pnindex remapping into distinct code
paths in StepToTopoDS_TranslateFace static helpers. Previously, the
pnindex array was always allocated (even when empty) and an integer
flag was checked everywhere via ternary operators, mixing two behaviors
in one expression. Now the handle null state is the single source of
truth: aPnindices is only allocated when NbPnindex() > 0, and all
consumers check !aPnindices.IsNull() to choose the code path.

Changes:
- GetSimpleFaceElements/GetComplexFaceElements: guard aPnindices
  allocation with count > 0, convert thePnIndNb from output parameter
  to local variable
- SetNodes: remove theNumPnindex parameter, split into two separate
  loops (indirection vs direct)
- SetNormals: rename misleading theNumPnindex to theNbNodes
- CreatePolyTriangulation: compute aNbNodes from aPnindices->Length()
  when non-null, remove dead aNumPnindex variable
- Add GTests for StepToTopoDS_TranslateFace
2026-02-12 18:44:54 +00:00
Pasukhin Dmitry
43adc26488 Foundation Classes, TCollection_AsciiString - fix multibyte UTF-8 handling in UsefullLength() (#1070)
Replace byte-by-byte backward scan with NCollection_UtfIterator-based
forward iteration that correctly handles multibyte UTF-8 sequences.
The old code treated individual UTF-8 bytes (>= 0x80) as non-graphic
via std::isgraph(), causing premature truncation of strings ending
with non-ASCII Unicode characters.
Added GTests for UsefullLength() covering ASCII and UTF-8 cases.
2026-02-12 18:03:50 +00:00
Kirill Gavrilov
279ab0c609 Visualization, OpenGl_Aspects - remove obsolete optimization forcing UNLIT shading (#1069)
Remove implicit optimization in OpenGl_Aspects that forced UNLIT shading
when material had no reflection properties. This broke PBR materials,
interior color handling, and texture modulation. All legacy code relying
on zero-material for UNLIT now explicitly sets SetShadingModel(Unlit).
Removed unused BUC60720 test command and QABugs_PresentableObject.
Added GTests for Graphic3d_Aspects shading model independence.
2026-02-12 15:13:31 +00:00
Kirill Gavrilov
f9fd32bcc4 Visualization - Avoid redundant shape copies in AIS_ColoredShape::dispatchColors (#1068)
Defer EmptyCopied() and BRep_Builder::Add() in dispatchColors() to avoid
redundant shape construction when the copy is not actually needed.
Non-overridden sub-shapes are collected into pre-allocated
NCollection_DynamicArray and the compound is only built when
required (partial override case).
Added GTests covering dispatchColors() dispatch logic.
2026-02-12 14:51:02 +00:00
Pasukhin Dmitry
2dcf137910 Modeling Data, Algorithms - Devirtualize adaptor dispatch, mark leaf Geom classes final (#1063)
Eliminate virtual dispatch for elementary geometry evaluation in GeomAdaptor_Curve, GeomAdaptor_Surface, and Geom2dAdaptor_Curve by storing gp_* primitives directly in std::variant and calling ElCLib/ElSLib static methods instead of going through virtual myCurve->D0()/mySurface->D0() calls.

Extend CurveDataVariant/SurfaceDataVariant with elementary types:
- GeomAdaptor_Curve: gp_Lin, gp_Circ, gp_Elips, gp_Hypr, gp_Parab
- GeomAdaptor_Surface: gp_Pln, gp_Cylinder, gp_Cone, gp_Sphere, gp_Torus
- Geom2dAdaptor_Curve: gp_Lin2d, gp_Circ2d, gp_Elips2d, gp_Hypr2d, gp_Parab2d

The load() method now extracts and stores the gp_* primitive at construction time. D0-DN methods dispatch via switch on the curve/surface type enum, calling ElCLib/ElSLib directly for elementary types. Accessor methods (Line(), Circle(), Plane(), etc.) return from the variant when available, avoiding repeated downcasts.

Mark every override method as final on all 29 concrete (leaf) classes in Geom_* and Geom2d_* hierarchies. These classes have no subclasses, so final enables compiler devirtualization and clearly documents the design intent. Affected methods include D0-DN, Reverse, Transform, Copy, DumpJson, and all other overridden virtuals.

Fix ShallowCopy in GeomAdaptor_Curve and GeomAdaptor_Surface where elementary gp_* types stored in the variant were not copied to the new object, which would cause std::bad_variant_access on first evaluation of the copy.
2026-02-11 17:19:54 +00:00
Pasukhin Dmitry
a934911912 Coding - Fix MSVC warnings C4723 and C4324 (#1060) 2026-02-11 09:22:42 +00:00
Pasukhin Dmitry
964a2c75df Modeling Data, Algorithms - Always-populated weights, direct array access migration, Hermit bug fix (#1058)
Introduce always-populated weight arrays in BSpline/Bezier curve and surface
classes using non-owning views over a static unit-weights buffer. Migrate
~100 callers across the codebase from deprecated copy-out APIs to direct
const-reference array access. Fix a long-standing typo bug in Hermit.cxx.

Infrastructure (BSplCLib, BSplSLib):
- Add BSplCLib::UnitWeights(n) returning a non-owning NCollection_Array1
  view over a compile-time-initialized static array of 2049 ones; falls
  back to heap allocation for larger sizes.
- Add BSplCLib::MaxUnitWeightsSize() (constexpr 2049) and
  BSplCLib::UnitWeightsData() exposing the raw pointer for BSplSLib.
- Add BSplSLib::UnitWeights(nU, nV) returning a non-owning
  NCollection_Array2 view when nU*nV <= 2049, heap-allocated otherwise.

Always-populated myWeights (Geom/Geom2d curve and surface classes):
- myWeights is now always sized to match poles count.
  Non-rational: non-owning view via UnitWeights (zero allocation).
  Rational: owning array with actual weight values.
- Add WeightsArray() returning const NCollection_Array1<double>& (curves)
  or const NCollection_Array2<double>& (surfaces) that is always valid.
- Update all constructors, copy constructors, and restructuring operations
  (IncreaseDegree, InsertKnots, RemoveKnot, Segment, SetPeriodic,
  SetOrigin, SetNotPeriodic, ExchangeUV, etc.) to maintain the invariant.
- SetWeight: copies non-owning view to owned array before mutation when
  transitioning to rational; assigns UnitWeights when becoming non-rational.
- Remove myRational derivation from myWeights.Size() in updateKnots();
  rationality is now tracked explicitly via the myRational flag only.
- Fix Geom2d_BSplineCurve::InsertPoleAfter missing myRational update
  after inserting a weighted pole.
- Fix Geom_BSplineCurve::DumpJson stale myWeights.Size() > 0 guard
  (changed to myRational, matching all other classes).

Caller migration to direct array access (~100 files):
- Replace deprecated copy-out pattern (allocate temp + call Foo(temp))
  with const-reference access for Poles(), Knots(), Multiplicities(),
  UKnots(), VKnots(), UMultiplicities(), VMultiplicities(),
  KnotSequence(), UKnotSequence(), VKnotSequence().
- Replace Weights() null-pointer patterns with WeightsArray() const-ref
  or *Weights() dereference where null check is still appropriate.
- Affected modules: GeomConvert, Geom2dConvert, GeomLib, GeomFill,
  ProjLib, ShapeUpgrade, ShapeCustom, ShapeConstruct, ShapeAnalysis,
  ShapeAlgo, BRepLib, BRepGProp, HLRBRep, ChFi3d, ChFiKPart, BlendFunc,
  FairCurve, IntTools, TopOpeBRepTool, TopOpeBRepBuild, LocOpe,
  BRepOffset, Adaptor3d, GeomAdaptor, Geom2dAdaptor, BndLib, Extrema,
  DrawTrSurf, GeometryTest, GeomliteTest, SWDRAW, QABugs,
  GeomToIGES, IGESToBRep, GeomToStep, StdPrs.

Bug fix in Hermit.cxx (PolyTest, both 3D and 2D overloads):
- Fix typo: "Pole0 < 3" changed to "Pole0 < Pole3" — was comparing
  a double variable against the integer literal 3 instead of the
  variable Pole3 holding the endpoint weight value.
- Fix logic: "if (boucle == 1)" changed to "else if (boucle == 1)"
  to make the boucle==1 and boucle==2 branches mutually exclusive.
- Add explanatory comments on BSplCLib::D1 calls that intentionally
  pass weight values as scalar "poles" to evaluate the weight function.

NCollection_PackedMapAlgo migration (TDataStd, QABugs):
- Replace deprecated member functions (IsSubset, Subtraction, Subtract,
  Unite, Intersect, IsEqual) with NCollection_PackedMapAlgo free functions.

GTests:
- New BSplCLib_Test.cxx: 5 tests for UnitWeights API.
- New BSplSLib_Test.cxx: 5 tests for surface UnitWeights API.
- New Hermit_Test.cxx: 11 tests for Hermit::Solution (3D/2D) and
  Hermit::Solutionbis covering uniform, distinct, high-ratio, reversed,
  symmetric weights and positive-poles invariant.
- Add WeightsArray tests to Geom_BSplineCurve_Test, Geom_BezierCurve_Test,
  Geom_BSplineSurface_Test, Geom_BezierSurface_Test (2 tests each)
  verifying const-ref return, non-owning for non-rational, owning for
  rational.
2026-02-10 18:41:34 +00:00
Pasukhin Dmitry
8949fd25f9 Coding - Fix clang warning suppression for function pointer casts (#1059)
- Switched from `__clang_major__ >= 16` gating to `__has_warning(...)` checks
- Added fallback suppression for `-Wcast-function-type` when `-Wcast-function-type-mismatch` is unavailable
2026-02-10 18:13:04 +00:00
Pasukhin Dmitry
498e7cd173 Foundation Classes, Convert - Replace handle-based APIs with direct array access (#1057)
Refactor the Convert package to eliminate heap-allocated handle-based storage
in favor of direct NCollection_Array members, improving performance and
simplifying the API. Deprecate single-element accessors (Pole, Knot, etc.)
in favor of batch const-reference accessors (Poles, Knots, etc.).

Convert_ConicToBSplineCurve:
- Replace handle members (poles, weights, knots, mults) with direct
  NCollection_Array1 fields (myPoles, myWeights, myKnots, myMults).
- Replace BuildCosAndSin handle-based parameters with array references.
- Add batch accessors: Poles(), Weights(), Knots(), Multiplicities().
- Deprecate single-element accessors: Pole(), Weight(), Knot(), Multiplicity().
- Update all conic subclasses: Circle, Ellipse, Hyperbola, Parabola.

Convert_ElementarySurfaceToBSplineSurface:
- Replace handle members with direct NCollection_Array fields
  (myPoles, myWeights, myUKnots, myVKnots, myUMults, myVMults).
- Add Finalize() to trim oversized arrays in derived constructors.
- Add batch accessors: Poles(), Weights(), UKnots(), VKnots(),
  UMultiplicities(), VMultiplicities().
- Deprecate single-element accessors: Pole(), Weight(), UKnot(), VKnot(),
  UMultiplicity(), VMultiplicity().
- Update all surface subclasses: Cone, Cylinder, Sphere, Torus.

Convert_CompPolynomialToPoles / Convert_GridPolynomialToPoles:
- Replace handle-based output parameters with direct const-reference
  accessors for Poles, Knots, Multiplicities.
- Deprecate old handle-based Poles(), Knots(), Multiplicities() overloads.

Convert_CompBezierCurvesToBSplineCurve (2D and 3D):
- Extract common logic into Convert_CompBezierCurvesToBSplineCurveBase
  template header to eliminate code duplication.
- Replace handle<HArray1> members with direct NCollection_Array1 storage
  in the internal sequence, removing unnecessary heap indirection.

NCollection_Sequence:
- Fix Node constructors to use member initializer lists (copy/move
  construction) instead of default-construct + assign, which failed for
  types like NCollection_Array1 where operator= requires matching sizes.

Downstream callers migrated:
- AdvApprox_ApproxAFunction: use new const-ref Knots()/Multiplicities().
- AppDef_Variational: use new const-ref Knots()/Multiplicities().
- AdvApp2Var_ApproxAFunc2Var, AdvApp2Var_Patch: use new const-ref API.
- Geom2dConvert, GeomConvert, GeomConvert_1: use new const-ref API.
- GeomFill_PolynomialConvertor, GeomFill_QuasiAngularConvertor: adapted.
- Geom_OsculatingSurface: use direct array references instead of
  handle->Array*() calls.

Added GTests for all Convert classes covering conic curves,
elementary surfaces, CompBezier, CompPolynomial, and GridPolynomial
conversions.
2026-02-09 16:38:55 +00:00
Pasukhin Dmitry
87703a2dac Modeling Data - Refactor BSpline/Bezier classes to use direct array members (#1056)
Replace handle-based NCollection_HArray1/HArray2 members with direct
NCollection_Array1/Array2 value members in Geom_BSplineCurve,
Geom2d_BSplineCurve, Geom_BSplineSurface, Geom_BezierCurve,
Geom2d_BezierCurve and Geom_BezierSurface. This eliminates heap
indirection and reference counting overhead for exclusively owned data.

Changes:
- Replace handle-wrapped arrays with value members (myPoles, myWeights,
  myKnots, myFlatKnots, myMults) using OCCT myFieldName convention
- Bezier classes store only myPoles/myWeights; knots, multiplicities and
  flat knots are provided by public instance methods (BezierKnots,
  BezierMults, BezierFlatKnots, etc.) returning static arrays by degree
- Add WeightsPtr() inline method on all classes returning nullptr for
  non-rational geometry, replacing scattered ternary expressions
- Add InternalFlatKnots(), InternalPoles() inline accessors for grid
  evaluation without virtual dispatch
- Deprecate copy-out accessor overloads (Knots(Array1&), Poles(Array1&),
  etc.) in favor of const-reference returning versions
- Remove #define macros (POLES, KNOTS, FKNOTS, FMULTS, WEIGHTS) from
  BSplineCurve_1.cxx and BSplineSurface_1.cxx, replacing with direct
  member access
- Update GeomGridEval and Geom_OsculatingSurface for new accessors

Bug fixes:
- Fix Geom_BSplineCurve::IsEqual skipping knot comparison due to reused
  pole loop index; replaced with separate loop-scoped iterators
- Fix Geom_BSplineSurface::SetUNotPeriodic/SetVNotPeriodic using wrong
  NCollection_Array2 5-arg constructor; replaced with 4-arg + Init(0.0)
- Fix Geom_BezierSurface::Increase self-referencing Init(myPoles,
  &myWeights) call; replaced with direct rationality flag update

NCollection_Array2 enhancements:
- Add ResizeWithTrim() for 2D-preserving resize (copies common sub-matrix
  maintaining row/col positions)
- Handle resize from empty arrays and same-size bound changes without
  unnecessary reallocation
2026-02-09 09:53:05 +00:00
Dmitrii Kulikov
f159fc0933 Modelling - Fixed crash in ComputePolesIndexes() (#1049)
- Replaced partial bound checks with `std::clamp()` to validate both bounds for `theOutMinIdx` and `theOutMaxIdx`
- Renamed local variable `mult` to `aMultiplier` for better clarity
2026-02-05 13:32:43 +00:00
Pasukhin Dmitry
fca1b3e0c3 Foundation Classes - Optimize NCollection_List (#1040)
- Added `std::initializer_list` constructor for convenient list initialization
- Improved const-correctness by providing separate const and non-const `begin()`/`end()` methods
- Optimized move constructor to directly transfer ownership instead of using move assignment
- Added `Exchange()` method for efficient list swapping without reallocation
2026-02-03 09:32:50 +00:00
Pasukhin Dmitry
5ce5f2e4dd Foundation Classes - Add Items() views with C++17 structured bindings to NCollection maps (#1038)
Add key-value pair iteration support with C++17 structured binding syntax to NCollection map classes. This enables modern iteration patterns like:
  for (auto [aKey, aValue] : aMap.Items()) { ... }

Changes include:
- New NCollection_ItemsView.hxx with reusable template utilities organized under namespace NCollection_ItemsView:
  - KeyValueRef: key-value pair reference for structured bindings
  - KeyValueIndexRef: key-value-index tuple for indexed maps
  - KeyIndexRef: key-index pair for key-only indexed maps
  - Iterator: generic forward iterator for view classes
  - View: generic view class for Items() iteration
- Items() method for NCollection_DataMap, NCollection_FlatDataMap, NCollection_IndexedDataMap returning key-value pair views
- IndexedItems() method for NCollection_IndexedMap and NCollection_IndexedDataMap returning key-index or key-value-index tuple views
- Custom hasher constructors (copy and move) for NCollection_DataMap, NCollection_FlatDataMap, NCollection_FlatMap, NCollection_Map
- GetHasher() accessor methods for all map types with custom hashers
- IsEqual() method for NCollection_FlatDataMap::Iterator and NCollection_FlatMap::Iterator to support proper iterator comparison
- Fixed copy constructors and assignment operators in FlatMap/FlatDataMap to preserve exact capacity and copy hasher state

The iterator equality comparison in NCollection_ItemsView::Iterator correctly checks both More() state and IsEqual() position, matching NCollection_StlIterator.

Added comprehensive GTest coverage for all new functionality including Items() iteration, structured bindings, hasher preservation, and iterator equality semantics.
2026-01-28 16:44:50 +00:00
Pasukhin Dmitry
218862282b Foundation Classes - Add Emplace methods to NCollection containers (#1035)
Add in-place construction support to sequential and array containers, following the pattern already established in map containers.

New methods added:
- NCollection_List: EmplaceAppend, EmplacePrepend, EmplaceBefore, EmplaceAfter
- NCollection_Sequence: EmplaceAppend, EmplacePrepend, EmplaceAfter, EmplaceBefore
- NCollection_DynamicArray: EmplaceAppend, EmplaceValue
- NCollection_Array1: EmplaceValue
- NCollection_Array2: EmplaceValue

NCollection_Sequence::Node class extended with in-place constructor to support the new Emplace methods.

All methods use perfect forwarding to construct elements in-place, avoiding unnecessary copies or moves. This is particularly useful for:
- Types with expensive copy/move operations
- Types with multiple constructor arguments
- Move-only types (non-copyable)

Added corresponding unit tests for all new methods.
2026-01-28 16:42:43 +00:00
Pasukhin Dmitry
8a31910e06 Coding - Fix compilation warnings (#1034)
- Added version guard for Clang compiler to conditionally apply `-Wcast-function-type-mismatch` pragma
- Wrapped deprecated `Standard_HMutex` typedef with deprecation warning suppression macros
2026-01-28 10:20:44 +00:00
Pasukhin Dmitry
c47d9c06b5 Mesh - Replace plugin system with registry-based factory pattern (#1033)
Replace the legacy DISCRETPLUGIN/DISCRETALGO symbol-based plugin system
with a clean registry-based factory pattern following the design of
Graphic3d_GraphicDriverFactory.

Problem: TKMesh and TKXMesh both exported the same DISCRETALGO symbol,
causing symbol collisions when both libraries were loaded. The old plugin
system required dlopen/dlsym which was error-prone and limited.

Solution: Each meshing algorithm now registers itself as a factory with
a unique name. Multiple algorithms can coexist and be selected at runtime.

New classes:
- BRepMesh_DiscretAlgoFactory: Abstract factory base with static registry
- BRepMesh_IncrementalMeshFactory: Factory for "FastDiscret" algorithm
- XBRepMesh_Factory: Factory for "XBRepMesh" algorithm

Removed (breaking changes):
- BRepMesh_PluginMacro.hxx: DISCRETPLUGIN macro
- BRepMesh_PluginEntryType.hxx: Legacy function pointer type
- BRepMesh_FactoryError.hxx: Legacy error enum
- XBRepMesh class: Replaced by XBRepMesh_Factory
- BRepMesh_DiscretFactory::Names(), SetFunctionName(), FunctionName(), ErrorStatus()
- Draw commands: mpsetfunctionname, mpgetfunctionname, mperror

Simplified BRepMesh_DiscretFactory API to delegate to the new registry.
Updated MeshTest_PluginCommands to use BRepMesh_DiscretAlgoFactory.
2026-01-24 16:52:30 +00:00
Pasukhin Dmitry
553466c590 Modeling - Simplify GeomGridEval classes (#1031)
- Removed point evaluation methods from surface evaluators (Torus, Sphere, Cylinder, Cone, Plane, BSpline, Bezier, SurfaceOfRevolution, SurfaceOfExtrusion, OffsetSurface, OtherSurface)
- Simplified BSplineSurface and BSplineCurve evaluation implementations with cleaner helper templates
- Updated utility functions to use surface adaptors directly instead of grid evaluators
- Removed corresponding test cases for point-based evaluation methods
- Cleaned up unused includes (`gp_Pnt2d.hxx`) and helper structures (`UVPoint`, `UVPointWithSpan`
2026-01-24 14:24:40 +00:00
Pasukhin Dmitry
1f251bb5ac Testing - Update CI workflow to build and test on Ubuntu with GCC (#1028)
- Replaced macOS Clang (No PCH) job with Ubuntu GCC (No PCH) job in the workflow dependency list
- Updated the build job to use `ubuntu-24.04` runner with GCC compiler instead of `macos-15` with Clang
- Updated the test job to run on Ubuntu with GCC instead of macOS with Clang
2026-01-24 12:03:19 +00:00
Pasukhin Dmitry
3aeb4668f5 Foundation Classes - Refactor TShape hierarchy for performance and memory efficiency (#1027)
- Made ShapeType() non-virtual by embedding the shape type in a compact uint16_t state field alongside flags
- Replaced int myFlags with uint16_t myState using a BitLayout enum for compact storage
- Moved Compose/Reverse/Complement operations from TopAbs.cxx to inline implementations in TopAbs.hxx
- Updated all TShape derived class constructors to pass their type to the base class
- Refactored TopoDS_Iterator to use index-based iteration with updateCurrentShape() helper
2026-01-23 21:08:39 +00:00
Pasukhin Dmitry
09996b852b Foundation Classes - Extend precompiled headers (#1029)
- Added precompiled header file for TKBool toolkit with commonly used headers
- Extended TKDESTEP precompiled headers with Interface_EntityIterator.hxx
- Configured Google Test to use precompiled headers when BUILD_USE_PCH is enabled
2026-01-23 19:55:58 +00:00
Pasukhin Dmitry
582822b32f Coding - Keep deprecated NCollection aliases (#1026)
- Added 900+ deprecated alias headers in `src/Deprecated/NCollectionAliases/` providing typedef wrappers with deprecation warnings
- Updated build system to install deprecated headers alongside regular headers
2026-01-22 21:55:26 +00:00
Pasukhin Dmitry
cc367178fb Foundation Classes - Add Try* and Emplace methods to NCollection maps (#1022)
- Added Try* methods for conditional binding (only insert if key doesn't exist)
- Added Emplace* methods for in-place construction of values
- Fixed memory safety issues in NCollection_FlatMap/FlatDataMap with proper storage management
- Fixed exception safety issue in NCollection_IndexedMap/IndexedDataMap by moving Increment() call
2026-01-22 19:10:51 +00:00
Pasukhin Dmitry
d05d28dba5 Testing - Use current run ID to download test results for platforms (#1025) 2026-01-22 19:10:04 +00:00
Pasukhin Dmitry
f71af062ad Foundation Classes - Refactor TColStd_PackedMapOfInteger and related classes (#1023)
- Replaced `TColStd_PackedMapOfInteger` implementation with a typedef to `NCollection_PackedMap<int>`
- Introduced new `NCollection_PackedMap` template class and `NCollection_PackedMapAlgo` namespace with standalone boolean operation functions
- Removed `TColStd_HPackedMapOfInteger` implementation files, keeping only the header as a deprecated wrapper
- Updated all iterator references from `TColStd_MapIteratorOfPackedMapOfInteger` to `TColStd_PackedMapOfInteger::Iterator`
- Replaced direct map method calls (Unite, Subtract, etc.) with standalone algorithm functions from `NCollection_PackedMapAlgo`
2026-01-22 17:19:10 +00:00
Pasukhin Dmitry
6707d70f59 Foundation Classes - Performance optimizations and new high-performance collections (#1015)
This commit introduces performance improvements across fundamental OCCT classes
and adds new high-performance collection types optimized for modern CPU architectures.

New Collection Classes:
- NCollection_FlatDataMap: High-performance hash map using open addressing with
  Robin Hood hashing. Provides better cache locality than NCollection_DataMap
  by storing all key-value pairs inline in a contiguous array. Features include
  power-of-2 sizing for fast modulo operations, cached hash codes, exception-safe
  insertion, and no per-element memory allocations.
- NCollection_FlatMap: High-performance hash set with the same optimizations.

Matrix and Vector Optimizations:
- math_Matrix: Cache-friendly i-k-j loop order for matrix multiplication.
  The inner loop now accesses matrix rows sequentially, significantly
  improving cache utilization for large matrices.
- math_VectorBase: Norm() and Norm2() rewritten with 4-way loop unrolling
  enabling better SIMD vectorization. Partial sums are combined pairwise for
  improved numerical stability.

Thread Safety Improvements:
- Standard_Transient: Optimized reference counting with explicit memory ordering.
  IncrementRefCounter uses relaxed ordering (sufficient for pure counting).
  DecrementRefCounter uses release ordering with an acquire fence only when
  the count reaches zero, avoiding unnecessary synchronization overhead on
  every decrement (follows std::shared_ptr pattern).
- Standard_Mutex: Deprecated in favor of std::mutex. Added deprecation warnings
  indicating removal in OCCT 8.0.0.

Bug Fixes:
- OSD_Thread (Windows): Added error handling for DuplicateHandle failure in
  Assign() method, properly resetting handle and thread ID on failure.
- OSD_Thread (POSIX): Fixed nanoseconds overflow in Wait() when the computed
  timeout exceeds 1 second. Added normalization to properly carry excess
  nanoseconds to seconds.

Tests:
- Added comprehensive GTest suites for NCollection_FlatDataMap and
  NCollection_FlatMap covering basic operations, iterators, edge cases,
  collisions, and performance characteristics.
2026-01-21 17:46:07 +00:00
Dmitrii Kulikov
20956a5f29 Coding - Refactoring BOPDS (#1007)
- Modernized C++ code using range-based for loops, structured bindings, and initializer lists
- Improved parameter and variable naming throughout the codebase for clarity
- Added parameterized constructors for `BOPDS_Pave` and `BOPDS_IndexRange` classes
2026-01-21 14:12:18 +00:00
Pasukhin Dmitry
36e781813e Coding - Revert type definitions for Standard_CString replacements (#1021)
Fix the replacement issue when Standard_CString was replaced to const char* even when it was const.
Now "const Standard_CString" is replaced with "const char* const".
Only places which were before const Standard_CString is replaced.
2026-01-21 10:09:22 +00:00
Pasukhin Dmitry
aea3d95052 Foundation Classes - Optimize TopLoc_Location::HashCode computation (#1006)
Update code with hash calculation to use pointer directly instead of Handle.
It helps to avoid casting and incrementing atomic counter.
2026-01-19 17:26:09 +00:00
Pasukhin Dmitry
848bf7f697 Foundation Classes - Enhance TCollection_ExtendedString with std::u16string_view support (#1009)
- Added constructor and assignment operator for std::u16string_view.
- Implemented conversion operator to std::u16string_view.
- Introduced methods to append std::u16string_view.
- Added Copy and assignment operator overloads for char16_t pointers.
- Fixed variable name inconsistencies (myLength vs mylength).
- Added new string manipulation methods: LeftAdjust, RightAdjust, LeftJustify, RightJustify, Center, Capitalize, Prepend, FirstLocationInSet, FirstLocationNotInSet, IntegerValue, IsIntegerValue, RealValue, IsRealValue, IsSameString.
2026-01-18 21:07:30 +00:00
Pasukhin Dmitry
13ab6349fd Documentation - Improve code examples in modeling algorithms (#1016)
- Updated `TopExp_Explorer` and `BRepTools_WireExplorer` usage to use modern constructor-based initialization instead of separate declaration and `Init()` calls
- Consolidated multi-line object construction patterns into single-line initializations
- Improved variable naming to follow OCCT conventions (e.g., `Ex1` → `anExpShell`, `builder` → `aBuilder`)
2026-01-18 18:24:30 +00:00
Pasukhin Dmitry
281d1475e2 Configuration - Accept empty FILES content (#1017)
Remove warning message for missing files in EXTRACT_PACKAGE_FILES function
2026-01-18 18:22:15 +00:00
Pasukhin Dmitry
5c253ac1c7 Documentation - Refactor documentation with new coding rules (#1013)
- Replaces `Handle(ClassName)` with `occ::handle<ClassName>` throughout documentation
- Updates `Standard_Integer`, `Standard_Real`, `Standard_Boolean`, `Standard_CString` to native C++ types (`int`, `double`, `bool`, `const char*`)
- Modernizes collection class references (e.g., `TDF_LabelSequence` to `NCollection_Sequence<TDF_Label>`)
2026-01-17 15:21:04 +00:00
Pasukhin Dmitry
3cda2770df Coding - Update AI Assistant guidelines (#1005)
- Updated handle syntax from `Handle(ClassName)` macro to `occ::handle<ClassName>` template
- Deprecated `Standard_*` type aliases in favor of native C++ types
- Removed package-specific collection aliases in favor of direct `NCollection_*` usage
2026-01-16 17:06:30 +00:00
Pasukhin Dmitry
b5cd7a8410 Coding - Suppress macOS system header warnings in multiple files (#997)
- Added clang diagnostic pragmas to suppress three specific warning types around macOS/iOS framework imports
- Added version-specific warning suppression for clang 20+ in the general warnings disable header
- Extended function cast warning suppression to cover clang's `-Wcast-function-type-mismatch`
2026-01-14 21:22:11 +00:00
Pasukhin Dmitry
0a1e8b7802 Coding - Include Standard_ErrorHandler header in OSD_signal (#996) 2026-01-14 21:21:12 +00:00
Dmitrii Kulikov
985287f213 Foundation Classes - Refactoring of gp_Pln (#1003)
- Renamed private member field from `pos` to `myPosition` throughout the class
- Added `[[nodiscard]]` attributes to getter and computation methods
- Introduced `SignedDistance()` methods for point, line, and plane to identify relative positions
- Refactored `Distance()` methods to use `SignedDistance()` internally, eliminating code duplication
- Made `gp_Ax3::Direct()` and `gp_Pln::Direct()` constexpr
2026-01-14 16:32:28 +00:00
Dmitrii Kulikov
c639199c01 Fixed warnings that appear when building with MSVC (#1004)
- Refactored loop control flow to use an `if` statement instead of a `for` loop with immediate `break`
- Changed variable type from `int` to `size_t` to match the expected type and eliminate conversion warnings
2026-01-14 14:49:43 +00:00
Pasukhin Dmitry
a36bca57a9 Coding - Clean up the FILES (#1002)
- Removed legacy metadata entries (EXTERNLIB, PACKAGES, DEFINES, FILES) that are no longer used by the build system
- Removed references to obsolete build artifacts (.lex, .yacc files) that appear to be superseded by generated .c/.h files
- Removed references to non-source files (README.md, .tcl scripts, GUID.txt) that shouldn't be listed in source file manifests
2026-01-14 14:46:42 +00:00
Pasukhin Dmitry
5d92701663 Testing - Update font installation process for Windows to use Noto Sans CJK (#999) 2026-01-14 09:41:44 +00:00
Pasukhin Dmitry
bfd3fcae2e Documentation - Fix issue with documentation build (#992)
- Modified Doxygen configuration to suppress documentation warnings and errors while enabling recursive example processing
- Removed sample documentation references from PDF and HTML file lists
- Updated example paths to include ViewerTest source files with recursive pattern matching
2026-01-12 09:06:59 +00:00
Pasukhin Dmitry
4afc8ef788 Coding - Optimization Box calculation in IntTools (#990)
- Optimized map lookup in `IntTools_SurfaceRangeLocalizeData::FindBox` by using `Seek()` instead of `IsBound()` + `operator()`
- Refactored surface handling functions to accept `BRepAdaptor_Surface` instead of `Handle(Geom_BSplineSurface)` to avoid redundant conversions
- Updated `ComputeGridPoints` to take both `BRepAdaptor_Surface` and `Handle(Geom_BSplineSurface)` parameters for accessing different surface properties
2026-01-09 15:16:13 +00:00
Pasukhin Dmitry
e1d36343e4 Foundation Classes - Inherited Standard_Failure from std::exception (#984)
First patch in iterative renovation of exceptions.

- Simplify exception classes to be container of data only.
- Removed redundant inclusion of <Standard_Type.hxx> in various header files across the project.
- Removed Set methods for failure and its define template.
- Removed Raise and Rerise static methods.
- Remove Instance and Throw methods
- Deprecated getting message with old approach, and moving to what()
- Update ErrorHandler to handle only specific list of exceptions.
2026-01-07 12:22:32 +00:00
Kirill Gavrilov
6c6f2ceb41 Coding - Use throw instead of legacy Standard_Failure::Raise (#983)
Replace Standard_*::Raise calls with throw statements for better exception handling
2026-01-05 19:17:00 +00:00
Kirill Gavrilov
078dfc44ae Foundation Classes, Standard_ErrorHandler - use thread_local stack instead of global mutex lock (#980)
Refactored Standard_ErrorHandler to use thread_local storage for the error handler stack
instead of a global list protected by mutex. This eliminates locking overhead entirely
since each thread only accesses its own error handlers.

Changes:
- Replaced global mutex-protected stack with thread_local Top pointer
- Simplified FindHandler() to directly return the thread-local Top
- Removed Catches() and LastCaughtError() methods (no longer needed)
- Added Raise() method for re-throwing caught exceptions
- Removed obsolete member variables: myStatus, myThread
- Deleted unused headers: Standard_HandlerStatus.hxx, Standard_JmpBuf.hxx, Standard_PErrorHandler.hxx
- Updated OCC_CATCH_SIGNALS macro to use new Raise() method
2026-01-05 17:03:00 +00:00
Dmitrii Kulikov
b9980c3c39 Shape Healing - GlueEdgesWithPCurves is not valid (#981)
- Removed non-functional pcurve handling code that was never properly executed
- Simplified the function to focus solely on 3D curve concatenation
- Improved code readability with better variable naming and modern C++ practices
2026-01-05 13:01:30 +00:00
Pasukhin Dmitry
463cf53106 Coding - Refactor reusing Extrema_ExtPS (#978)
- Eliminates redundant `Extrema_ExtPS` object creation by initializing once and performing multiple projections
- Removes unused `#include <Extrema_ExtPS.hxx>` directives from files that no longer directly instantiate the class
- Improves performance by avoiding repeated surface initialization overhead
2026-01-04 12:07:25 +00:00
Pasukhin Dmitry
6c24544fe1 Coding - Apply more flags from Clang-tidy (#977)
- Refactor boolean expressions and improve code readability across multiple files
- Simplified boolean expressions by removing unnecessary comparisons to true/false.
- Replaced explicit boolean checks with direct variable usage 

Used flags:
readability-static-accessed-through-instance
readability-simplify-boolean-expr
performance-for-range-copy
performance-move-const-arg
misc-unused-parameters
misc-redundant-expression
2026-01-03 12:18:59 +00:00
Pasukhin Dmitry
825b0bd782 Coding - Fix GCC warnings (#975)
- Removed unnecessary reference qualifiers (`&`) from `gp_Dir` variable declarations in geometric evaluation classes
- Initialized previously uninitialized variables (`DuvBuf`, `anFDOpenMode`) to prevent undefined behavior
- Removed redundant `Standard_EXPORT` from deleted copy constructors
- Added explicit base class initialization in `EnumeratedThread` copy constructor
- Replaced C-style cast with `reinterpret_cast` in `Quantity_ColorRGBA` for type safety
2026-01-02 14:34:45 +00:00
Pasukhin Dmitry
372e9431e9 Coding - Refactor BSplineCurve and BSplineSurface parameter preparation (#972)
- Introduced a new `PreparedParams` struct to encapsulate both parameter and span data in `GeomGridEval_BSplineCurve`.
- Updated `prepareParams` function to return `PreparedParams` instead of using output parameters for span data.
- Simplified the parameter preparation process in `GeomGridEval_BSplineSurface` by creating dedicated functions `prepareGridPoints` and `preparePairPoints` that return sorted UV points with span information.
- Removed redundant `locateSpan` and `computeSpansAndSort` methods from the public interface of `GeomGridEval_BSplineSurface`.
- Enhanced code readability and maintainability by reducing the number of parameters passed to functions and encapsulating related data.
2025-12-30 21:58:12 +00:00