From 8a049da9306ac1bd87745e941f82d71614ce597d Mon Sep 17 00:00:00 2001 From: bangerth Date: Thu, 15 Oct 2009 22:57:43 +0000 Subject: [PATCH] Implement indexing also for non-contiguous ranges. git-svn-id: https://svn.dealii.org/trunk@19897 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/base/include/base/index_set.h | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/deal.II/base/include/base/index_set.h b/deal.II/base/include/base/index_set.h index eb6a8b2bf1..b310ade67f 100644 --- a/deal.II/base/include/base/index_set.h +++ b/deal.II/base/include/base/index_set.h @@ -438,8 +438,17 @@ IndexSet::nth_index_in_set (const unsigned int n) const { Assert (n < n_elements(), ExcIndexRange (n, 0, n_elements())); - Assert (is_contiguous(), ExcNotImplemented()); - return (n+ranges.begin()->begin); +//TODO: this could be done more efficiently by using a binary search + for (std::vector::const_iterator p = ranges.begin(); + p != ranges.end(); ++p) + { + Assert (n >= p->nth_index_in_set, ExcInternalError()); + if (n < p->nth_index_in_set + (p->end-p->begin)) + return p->begin + (n-p->nth_index_in_set); + } + + Assert (false, ExcInternalError()); + return numbers::invalid_unsigned_int; } @@ -452,8 +461,17 @@ IndexSet::index_within_set (const unsigned int n) const ExcMessage ("Given number is not an element of this set.")); Assert (n < size(), ExcIndexRange (n, 0, size())); - Assert (is_contiguous(), ExcNotImplemented()); - return (n-ranges.begin()->begin); +//TODO: this could be done more efficiently by using a binary search + for (std::vector::const_iterator p = ranges.begin(); + p != ranges.end(); ++p) + { + Assert (n >= p->begin, ExcInternalError()); + if (n < p->end) + return (n-p->begin) + p->nth_index_in_set; + } + + Assert (false, ExcInternalError()); + return numbers::invalid_unsigned_int; } -- 2.39.5