1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
12 #include <mdds/flat_segment_tree.hpp>
17 template<typename Key
, typename Span
>
19 std::vector
<Span
>& rSpans
,
20 typename
mdds::flat_segment_tree
<Key
,bool>::const_iterator it
,
21 typename
mdds::flat_segment_tree
<Key
,bool>::const_iterator itEnd
, const Key
* pStart
)
23 Key nLastPos
= it
->first
;
24 bool bLastVal
= it
->second
;
25 for (++it
; it
!= itEnd
; ++it
)
27 Key nThisPos
= it
->first
;
28 bool bThisVal
= it
->second
;
32 Key nIndex1
= nLastPos
;
33 Key nIndex2
= nThisPos
-1;
35 if (!pStart
|| *pStart
< nIndex1
)
36 rSpans
.push_back(Span(nIndex1
, nIndex2
));
37 else if (*pStart
<= nIndex2
)
38 rSpans
.push_back(Span(*pStart
, nIndex2
));
46 template<typename Key
, typename Val
, typename Span
>
47 void buildSpanWithValue(
48 std::vector
<Span
>& rSpans
,
49 typename
mdds::flat_segment_tree
<Key
,Val
>::const_iterator it
,
50 typename
mdds::flat_segment_tree
<Key
,Val
>::const_iterator itEnd
)
52 Key nLastPos
= it
->first
;
53 Val nLastVal
= it
->second
;
54 for (++it
; it
!= itEnd
; ++it
)
56 Key nThisPos
= it
->first
;
57 Val nThisVal
= it
->second
;
61 Key nIndex1
= nLastPos
;
62 Key nIndex2
= nThisPos
-1;
63 rSpans
.push_back(Span(nIndex1
, nIndex2
, nLastVal
));
72 * Convert a flat_segment_tree structure whose value type is boolean, into
73 * an array of ranges that corresponds with the segments that have a 'true'
76 template<typename Key
, typename Span
>
77 std::vector
<Span
> toSpanArray( const mdds::flat_segment_tree
<Key
,bool>& rTree
)
79 typedef mdds::flat_segment_tree
<Key
,bool> FstType
;
81 std::vector
<Span
> aSpans
;
83 typename
FstType::const_iterator it
= rTree
.begin(), itEnd
= rTree
.end();
84 buildSpan
<Key
,Span
>(aSpans
, it
, itEnd
, nullptr);
89 * Convert a flat_segment_tree structure into an array of ranges with
90 * values. Only those ranges whose value is evaluated to be true will be
91 * included. The value type must be something that supports bool operator.
92 * The span type must support a constructor that takes a start key, an end
93 * key and a value in this order.
95 template<typename Key
, typename Val
, typename Span
>
96 std::vector
<Span
> toSpanArrayWithValue( const mdds::flat_segment_tree
<Key
,Val
>& rTree
)
98 typedef mdds::flat_segment_tree
<Key
,Val
> FstType
;
100 std::vector
<Span
> aSpans
;
102 typename
FstType::const_iterator it
= rTree
.begin(), itEnd
= rTree
.end();
103 buildSpanWithValue
<Key
,Val
,Span
>(aSpans
, it
, itEnd
);
107 template<typename Key
, typename Span
>
108 std::vector
<Span
> toSpanArray( const mdds::flat_segment_tree
<Key
,bool>& rTree
, Key nStartPos
)
110 typedef mdds::flat_segment_tree
<Key
,bool> FstType
;
112 std::vector
<Span
> aSpans
;
113 if (!rTree
.is_tree_valid())
116 bool bThisVal
= false;
117 std::pair
<typename
FstType::const_iterator
, bool> r
=
118 rTree
.search_tree(nStartPos
, bThisVal
);
121 // Tree search failed.
124 typename
FstType::const_iterator it
= r
.first
, itEnd
= rTree
.end();
125 buildSpan
<Key
,Span
>(aSpans
, it
, itEnd
, &nStartPos
);
131 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */