forked from uber/h3-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
h3_iterators.h
86 lines (77 loc) · 2.59 KB
/
h3_iterators.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
* Copyright 2021 Uber Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file iterators.h
* @brief Iterator structs and functions for the children of a cell,
* or cells at a given resolution.
*/
#ifndef ITERATORS_H
#define ITERATORS_H
#include <stdint.h>
#include "h3_h3api.h"
/**
* IterCellsChildren: struct for iterating through the descendants of
* a given cell.
*
* Constructors:
*
* Initialize with either `iterInitParent` or `iterInitBaseCellNum`.
* `iterInitParent` sets up an iterator for all the children of a given
* parent cell at a given resolution.
*
* `iterInitBaseCellNum` sets up an iterator for children cells, given
* a base cell number (0--121).
*
* Iteration:
*
* Step iterator with `iterStepChild`.
* During the lifetime of the `IterCellsChildren`, the current iterate
* is accessed via the `IterCellsChildren.h` member.
* When the iterator is exhausted or if there was an error in initialization,
* `IterCellsChildren.h` will be `H3_NULL` even after calling `iterStepChild`.
*/
typedef struct {
H3Index h;
int _parentRes; // parent resolution
int _skipDigit; // this digit skips `1` for pentagons
} IterCellsChildren;
DECLSPEC IterCellsChildren iterInitParent(H3Index h, int childRes);
DECLSPEC IterCellsChildren iterInitBaseCellNum(int baseCellNum, int childRes);
DECLSPEC void iterStepChild(IterCellsChildren *iter);
/**
* IterCellsResolution: struct for iterating through all cells at a given
* resolution
*
* Constructor:
*
* Initialize with `IterCellsResolution`.
*
* Iteration:
*
* Step iterator with `iterStepRes`.
* During the lifetime of the iterator the current iterate
* is accessed via the `IterCellsResolution.h` member.
* When the iterator is exhausted or if there was an error in initialization,
* `IterCellsResolution.h` will be `H3_NULL` even after calling `iterStepRes`.
*/
typedef struct {
H3Index h;
int _baseCellNum;
int _res;
IterCellsChildren _itC;
} IterCellsResolution;
DECLSPEC IterCellsResolution iterInitRes(int res);
DECLSPEC void iterStepRes(IterCellsResolution *iter);
#endif