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/.
10 #ifndef INCLUDED_SC_INC_FSTALGORITHM_HXX
11 #define INCLUDED_SC_INC_FSTALGORITHM_HXX
13 #include <mdds/flat_segment_tree.hpp>
18 template<typename Key
, typename Span
>
20 std::vector
<Span
>& rSpans
,
21 typename
mdds::flat_segment_tree
<Key
,bool>::const_iterator it
,
22 typename
mdds::flat_segment_tree
<Key
,bool>::const_iterator itEnd
, const Key
* pStart
)
24 Key nLastPos
= it
->first
;
25 bool bLastVal
= it
->second
;
26 for (++it
; it
!= itEnd
; ++it
)
28 Key nThisPos
= it
->first
;
29 bool bThisVal
= it
->second
;
33 Key nIndex1
= nLastPos
;
34 Key nIndex2
= nThisPos
-1;
36 if (!pStart
|| *pStart
< nIndex1
)
37 rSpans
.push_back(Span(nIndex1
, nIndex2
));
38 else if (*pStart
<= nIndex2
)
39 rSpans
.push_back(Span(*pStart
, nIndex2
));
47 template<typename Key
, typename Val
, typename Span
>
48 void buildSpanWithValue(
49 std::vector
<Span
>& rSpans
,
50 typename
mdds::flat_segment_tree
<Key
,Val
>::const_iterator it
,
51 typename
mdds::flat_segment_tree
<Key
,Val
>::const_iterator itEnd
)
53 Key nLastPos
= it
->first
;
54 Val nLastVal
= it
->second
;
55 for (++it
; it
!= itEnd
; ++it
)
57 Key nThisPos
= it
->first
;
58 Val nThisVal
= it
->second
;
62 Key nIndex1
= nLastPos
;
63 Key nIndex2
= nThisPos
-1;
64 rSpans
.push_back(Span(nIndex1
, nIndex2
, nLastVal
));
73 * Convert a flat_segment_tree structure whose value type is boolean, into
74 * an array of ranges that corresponds with the segments that have a 'true'
77 template<typename Key
, typename Span
>
78 std::vector
<Span
> toSpanArray( const mdds::flat_segment_tree
<Key
,bool>& rTree
)
80 typedef mdds::flat_segment_tree
<Key
,bool> FstType
;
82 std::vector
<Span
> aSpans
;
84 typename
FstType::const_iterator it
= rTree
.begin(), itEnd
= rTree
.end();
85 buildSpan
<Key
,Span
>(aSpans
, it
, itEnd
, nullptr);
90 * Convert a flat_segment_tree structure into an array of ranges with
91 * values. Only those ranges whose value is evaluated to be true will be
92 * included. The value type must be something that supports bool operator.
93 * The span type must support a constructor that takes a start key, an end
94 * key and a value in this order.
96 template<typename Key
, typename Val
, typename Span
>
97 std::vector
<Span
> toSpanArrayWithValue( const mdds::flat_segment_tree
<Key
,Val
>& rTree
)
99 typedef mdds::flat_segment_tree
<Key
,Val
> FstType
;
101 std::vector
<Span
> aSpans
;
103 typename
FstType::const_iterator it
= rTree
.begin(), itEnd
= rTree
.end();
104 buildSpanWithValue
<Key
,Val
,Span
>(aSpans
, it
, itEnd
);
108 template<typename Key
, typename Span
>
109 std::vector
<Span
> toSpanArray( const mdds::flat_segment_tree
<Key
,bool>& rTree
, Key nStartPos
)
111 typedef mdds::flat_segment_tree
<Key
,bool> FstType
;
113 std::vector
<Span
> aSpans
;
114 if (!rTree
.is_tree_valid())
117 bool bThisVal
= false;
118 std::pair
<typename
FstType::const_iterator
, bool> r
=
119 rTree
.search_tree(nStartPos
, bThisVal
);
122 // Tree search failed.
125 typename
FstType::const_iterator it
= r
.first
, itEnd
= rTree
.end();
126 buildSpan
<Key
,Span
>(aSpans
, it
, itEnd
, &nStartPos
);
134 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */