*/
class RangePartitioning
{
- public:
- /*! \brief A block defined by a range of atom indices */
- using Block = Range<int>;
-
- /*! \brief Returns the number of blocks */
- int numBlocks() const
- {
- return static_cast<int>(index_.size()) - 1;
- }
-
- /*! \brief Returns the size of the block with index \p blockIndex */
- Block block(int blockIndex) const
- {
- return Block(index_[blockIndex], index_[blockIndex + 1]);
- }
-
- /*! \brief Returns the full range */
- Block fullRange() const
- {
- return Block(index_.front(), index_.back());
- }
-
- /*! \brief Returns a range starting at \p blockIndexBegin and ending at \p blockIndexEnd */
- Block subRange(int blockIndexBegin,
- int blockIndexEnd) const
- {
- return Block(index_[blockIndexBegin], index_[blockIndexEnd]);
- }
-
- /*! \brief Returns true when all blocks have size 0 or numBlocks()=0 */
- bool allBlocksHaveSizeOne() const
- {
- return (index_.back() == numBlocks());
- }
-
- /*! \brief Appends a block of size \p blockSize at the end of the range
- *
- * \note blocksize has to be >= 1
- */
- void appendBlock(int blockSize)
- {
- GMX_ASSERT(blockSize > 0, "block sizes should be >= 1");
- index_.push_back(index_.back() + blockSize);
- }
-
- /*! \brief Removes all blocks */
- void clear()
- {
- index_.resize(1);
- }
-
- /*! \brief Reduces the number of blocks to \p newNumBlocks
- *
- * \note \p newNumBlocks should be <= numBlocks().
- */
- void reduceNumBlocks(int newNumBlocks)
- {
- GMX_ASSERT(newNumBlocks <= numBlocks(), "Can only shrink to fewer blocks");
- index_.resize(newNumBlocks + 1);
- }
-
- /*! \brief Sets the partitioning to \p numBlocks blocks each of size 1 */
- void setAllBlocksSizeOne(int numBlocks);
-
- /*! \brief Returns the raw block index array, avoid using this */
- std::vector<int> &rawIndex()
- {
- return index_;
- }
-
- private:
- std::vector<int> index_ = { 0 }; /**< The list of block begin/end indices */
+public:
+ /*! \brief A block defined by a range of atom indices */
+ using Block = Range<int>;
+
+ /*! \brief Returns the number of blocks */
+ int numBlocks() const { return static_cast<int>(index_.size()) - 1; }
+
+ /*! \brief Returns the size of the block with index \p blockIndex */
+ Block block(int blockIndex) const { return Block(index_[blockIndex], index_[blockIndex + 1]); }
+
+ /*! \brief Returns the full range */
+ Block fullRange() const { return Block(index_.front(), index_.back()); }
+
+ /*! \brief Returns a range starting at \p blockIndexBegin and ending at \p blockIndexEnd */
+ Block subRange(int blockIndexBegin, int blockIndexEnd) const
+ {
+ return Block(index_[blockIndexBegin], index_[blockIndexEnd]);
+ }
+
+ /*! \brief Returns true when all blocks have size 0 or numBlocks()=0 */
+ bool allBlocksHaveSizeOne() const { return (index_.back() == numBlocks()); }
+
+ /*! \brief Appends a block of size \p blockSize at the end of the range
+ *
+ * \note blocksize has to be >= 1
+ */
+ void appendBlock(int blockSize)
+ {
+ GMX_ASSERT(blockSize > 0, "block sizes should be >= 1");
+ index_.push_back(index_.back() + blockSize);
+ }
+
+ /*! \brief Removes all blocks */
+ void clear() { index_.resize(1); }
+
+ /*! \brief Reduces the number of blocks to \p newNumBlocks
+ *
+ * \note \p newNumBlocks should be <= numBlocks().
+ */
+ void reduceNumBlocks(int newNumBlocks)
+ {
+ GMX_ASSERT(newNumBlocks <= numBlocks(), "Can only shrink to fewer blocks");
+ index_.resize(newNumBlocks + 1);
+ }
+
+ /*! \brief Sets the partitioning to \p numBlocks blocks each of size 1 */
+ void setAllBlocksSizeOne(int numBlocks);
+
+ /*! \brief Returns the raw block index array, avoid using this */
+ std::vector<int>& rawIndex() { return index_; }
+
+private:
+ std::vector<int> index_ = { 0 }; /**< The list of block begin/end indices */
};
-} // namespace gmx
+} // namespace gmx
/* Deprecated, C-style version of RangePartitioning */
typedef struct t_block
return index[blockIndex + 1] - index[blockIndex];
}
- int nr; /* The number of blocks */
- int *index; /* Array of indices (dim: nr+1) */
- int nalloc_index; /* The allocation size for index */
+ int nr; /* The number of blocks */
+ int* index; /* Array of indices (dim: nr+1) */
+ int nalloc_index; /* The allocation size for index */
} t_block;
struct t_blocka
{
- int nr; /* The number of blocks */
- int *index; /* Array of indices in a (dim: nr+1) */
- int nra; /* The number of atoms */
- int *a; /* Array of atom numbers in each group */
+ int nr; /* The number of blocks */
+ int* index; /* Array of indices in a (dim: nr+1) */
+ int nra; /* The number of atoms */
+ int* a; /* Array of atom numbers in each group */
/* (dim: nra) */
/* Block i (0<=i<nr) runs from */
/* index[i] to index[i+1]-1. There will */
/* allways be an extra entry in index */
/* to terminate the table */
- int nalloc_index; /* The allocation size for index */
- int nalloc_a; /* The allocation size for a */
+ int nalloc_index; /* The allocation size for index */
+ int nalloc_a; /* The allocation size for a */
};
/*! \brief
*
* \param[in,out] block datastructure to initialize.
*/
-void init_block(t_block *block);
+void init_block(t_block* block);
/*! \brief
* Fully initialize t_blocka datastructure.
*
* \param[in,out] block datastructure to initialize.
*/
-void init_blocka(t_blocka *block);
+void init_blocka(t_blocka* block);
/* TODO
* In general all t_block datastructures should be avoided
*
* \param[in,out] block datastructure to initialize.
*/
-void init_block_null(t_block *block);
+void init_block_null(t_block* block);
/*! \brief
* Minimal initialization of t_blocka datastructure.
*
* \param[in,out] block datastructure to initialize.
*/
-void init_blocka_null(t_blocka *block);
+void init_blocka_null(t_blocka* block);
-t_blocka *new_blocka();
+t_blocka* new_blocka();
/* allocate new block */
-void done_block(t_block *block);
-void done_blocka(t_blocka *block);
+void done_block(t_block* block);
+void done_blocka(t_blocka* block);
-void copy_blocka(const t_blocka *src, t_blocka *dest);
+void copy_blocka(const t_blocka* src, t_blocka* dest);
-void copy_block(const t_block *src, t_block *dst);
+void copy_block(const t_block* src, t_block* dst);
-void stupid_fill_block(t_block *grp, int natom, gmx_bool bOneIndexGroup);
+void stupid_fill_block(t_block* grp, int natom, gmx_bool bOneIndexGroup);
/* Fill a block structure with numbers identical to the index
* (0, 1, 2, .. natom-1)
* If bOneIndexGroup, then all atoms are lumped in one index group,
* otherwise there is one atom per index entry
*/
-void stupid_fill_blocka(t_blocka *grp, int natom);
+void stupid_fill_blocka(t_blocka* grp, int natom);
/* Fill a block structure with numbers identical to the index
* (0, 1, 2, .. natom-1)
* There is one atom per index entry
*/
-void pr_block(FILE *fp, int indent, const char *title, const t_block *block, gmx_bool bShowNumbers);
-void pr_blocka(FILE *fp, int indent, const char *title, const t_blocka *block, gmx_bool bShowNumbers);
+void pr_block(FILE* fp, int indent, const char* title, const t_block* block, gmx_bool bShowNumbers);
+void pr_blocka(FILE* fp, int indent, const char* title, const t_blocka* block, gmx_bool bShowNumbers);
#endif