23 #ifndef LSST_SPHGEOM_CHUNKER_H_
24 #define LSST_SPHGEOM_CHUNKER_H_
45 std::vector<int32_t> subChunkIds;
50 std::swap(chunkId, sc.chunkId);
51 subChunkIds.swap(sc.subChunkIds);
69 int32_t numSubStripesPerStripe);
71 bool operator==(
Chunker const & c)
const {
72 return _numStripes == c._numStripes &&
73 _numSubStripesPerStripe == c._numSubStripesPerStripe;
76 bool operator!=(
Chunker const & c)
const {
77 return _numStripes != c._numStripes ||
78 _numSubStripesPerStripe != c._numSubStripesPerStripe;
90 return _numSubStripesPerStripe;
110 bool valid(int32_t chunkId)
const;
115 int32_t numChunksPerStripe;
116 int32_t numSubChunksPerChunk;
120 numChunksPerStripe(0),
121 numSubChunksPerChunk(0)
127 int32_t numSubChunksPerChunk;
129 SubStripe() : subChunkWidth(), numSubChunksPerChunk(0) {}
132 int32_t _getStripe(int32_t chunkId)
const {
133 return chunkId / (2 * _numStripes);
136 int32_t _getChunk(int32_t chunkId, int32_t stripe)
const {
137 return chunkId - stripe*2*_numStripes;
140 int32_t _getChunkId(int32_t stripe, int32_t chunk)
const {
141 return stripe * 2 * _numStripes + chunk;
144 int32_t _getSubChunkId(int32_t stripe, int32_t subStripe,
145 int32_t chunk, int32_t subChunk)
const {
146 int32_t y = subStripe - stripe * _numSubStripesPerStripe;
147 int32_t x = subChunk -
148 chunk * _subStripes[subStripe].numSubChunksPerChunk;
149 return y * _maxSubChunksPerSubStripeChunk + x;
152 void _getSubChunks(std::vector<SubChunks> & subChunks,
154 NormalizedAngleInterval
const & lon,
158 int32_t maxSS)
const;
159 Box _getChunkBoundingBox(int32_t stripe, int32_t chunk)
const;
160 Box _getSubChunkBoundingBox(int32_t subStripe, int32_t subChunk)
const;
163 int32_t _numSubStripesPerStripe;
164 int32_t _numSubStripes;
165 int32_t _maxSubChunksPerSubStripeChunk;
166 Angle _subStripeHeight;
167 std::vector<Stripe> _stripes;
168 std::vector<SubStripe> _subStripes;
173 #endif // LSST_SPHGEOM_CHUNKER_H_