1 #if !defined(_LABELIMPL_H) 2 #define _LABELIMPL_H 3 4 #include <petscdmlabel.h> 5 #include <petscbt.h> 6 #include <petscistypes.h> 7 #include <petsc/private/hash.h> 8 9 /* This is an integer map, in addition it is also a container class 10 Design points: 11 - Low storage is the most important design point 12 - We want flexible insertion and deletion 13 - We can live with O(log) query, but we need O(1) iteration over strata 14 */ 15 struct _n_DMLabel { 16 PetscInt refct; 17 PetscObjectState state; 18 char *name; /* Label name */ 19 PetscInt numStrata; /* Number of integer values */ 20 PetscInt defaultValue; /* Background value when no value explicitly given */ 21 PetscInt *stratumValues; /* Value of each stratum */ 22 /* Basic IS storage */ 23 PetscBool *validIS; /* The IS is valid (no additions need to be merged in) */ 24 PetscInt *stratumSizes; /* Size of each stratum */ 25 IS *points; /* Points for each stratum, always sorted */ 26 /* Hashtable for fast insertion */ 27 PetscHashI *ht; /* Hash table for fast insertion */ 28 /* Index for fast search */ 29 PetscInt pStart, pEnd; /* Bounds for index lookup */ 30 PetscBT bt; /* A bit-wise index */ 31 }; 32 33 PETSC_INTERN PetscErrorCode PetscSectionSymCreate_Label(PetscSectionSym); 34 #endif 35