Actual source code: hashmapijv.h
1: #pragma once
3: #include <petsc/private/hashmap.h>
4: #include <petsc/private/hashijkey.h>
6: /* SUBMANSEC = Sys */
7: /*
8: Hash map from (PetscInt,PetscInt) --> PetscScalar
9: */
10: PETSC_HASH_MAP(HMapIJV, PetscHashIJKey, PetscScalar, PetscHashIJKeyHash, PetscHashIJKeyEqual, -1)
12: /*MC
13: PetscHMapIJVQueryAdd - Add value to the value of a given key if the key exists,
14: otherwise, insert a new (key,value) entry in the hash table
16: Synopsis:
17: #include <petsc/private/hashmapijv.h>
18: PetscErrorCode PetscHMapIJVQueryAdd(PetscHMapT ht,PetscHashIJKey key,PetscScalar val,PetscBool *missing)
20: Input Parameters:
21: + ht - The hash table
22: . key - The key
23: - val - The value
25: Output Parameter:
26: . missing - `PETSC_TRUE` if the `PetscHMapIJV` did not already have the given key
28: Level: developer
30: .seealso: `PetscHMapIJVSetWithMode()`, `PetscHMapIJV`, `PetscHMapIJVGet()`, `PetscHMapIJVIterSet()`, `PetscHMapIJVSet()`
31: M*/
32: static inline PetscErrorCode PetscHMapIJVQueryAdd(PetscHMapIJV ht, PetscHashIJKey key, PetscScalar val, PetscBool *missing)
33: {
34: int ret;
35: khiter_t iter;
37: PetscFunctionBeginHot;
38: PetscAssertPointer(ht, 1);
39: iter = kh_put(HMapIJV, ht, key, &ret);
40: PetscHashAssert(ret >= 0);
41: if (ret) kh_val(ht, iter) = val;
42: else kh_val(ht, iter) += val;
43: *missing = ret ? PETSC_TRUE : PETSC_FALSE;
44: PetscFunctionReturn(PETSC_SUCCESS);
45: }