]>
git.proxmox.com Git - rustc.git/blob - vendor/pest/src/iterators/flat_pairs.rs
1 // pest. The Elegant Parser
2 // Copyright (c) 2018 DragoČ™ Tiselice
4 // Licensed under the Apache License, Version 2.0
5 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT
6 // license <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7 // option. All files in the project carrying such notice may not be copied,
8 // modified, or distributed except according to those terms.
13 use super::pair
::{self, Pair}
;
14 use super::queueable_token
::QueueableToken
;
15 use super::tokens
::{self, Tokens}
;
18 /// An iterator over [`Pair`]s. It is created by [`Pairs::flatten`].
20 /// [`Pair`]: struct.Pair.html
21 /// [`Pairs::flatten`]: struct.Pairs.html#method.flatten
22 pub struct FlatPairs
<'i
, R
> {
23 queue
: Rc
<Vec
<QueueableToken
<R
>>>,
29 pub fn new
<R
: RuleType
>(
30 queue
: Rc
<Vec
<QueueableToken
<R
>>>,
43 impl<'i
, R
: RuleType
> FlatPairs
<'i
, R
> {
44 /// Returns the `Tokens` for these pairs.
49 /// # use std::rc::Rc;
51 /// # #[allow(non_camel_case_types)]
52 /// # #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
58 /// let pairs = pest::state(input, |state| {
59 /// // generating Token pair with Rule::a ...
60 /// # state.rule(Rule::a, |s| Ok(s))
62 /// let tokens: Vec<_> = pairs.flatten().tokens().collect();
64 /// assert_eq!(tokens.len(), 2);
67 pub fn tokens(self) -> Tokens
<'i
, R
> {
68 tokens
::new(self.queue
, self.input
, self.start
, self.end
)
71 fn next_start(&mut self) {
74 while self.start
< self.end
&& !self.is_start(self.start
) {
79 fn next_start_from_end(&mut self) {
82 while self.end
>= self.start
&& !self.is_start(self.end
) {
87 fn is_start(&self, index
: usize) -> bool
{
88 match self.queue
[index
] {
89 QueueableToken
::Start { .. }
=> true,
90 QueueableToken
::End { .. }
=> false,
95 impl<'i
, R
: RuleType
> Iterator
for FlatPairs
<'i
, R
> {
96 type Item
= Pair
<'i
, R
>;
98 fn next(&mut self) -> Option
<Self::Item
> {
99 if self.start
>= self.end
{
103 let pair
= pair
::new(Rc
::clone(&self.queue
), self.input
, self.start
);
111 impl<'i
, R
: RuleType
> DoubleEndedIterator
for FlatPairs
<'i
, R
> {
112 fn next_back(&mut self) -> Option
<Self::Item
> {
113 if self.end
<= self.start
{
117 self.next_start_from_end();
119 let pair
= pair
::new(Rc
::clone(&self.queue
), self.input
, self.end
);
125 impl<'i
, R
: RuleType
> fmt
::Debug
for FlatPairs
<'i
, R
> {
126 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
127 f
.debug_struct("FlatPairs")
128 .field("pairs", &self.clone().collect
::<Vec
<_
>>())
133 impl<'i
, R
: Clone
> Clone
for FlatPairs
<'i
, R
> {
134 fn clone(&self) -> FlatPairs
<'i
, R
> {
136 queue
: Rc
::clone(&self.queue
),
146 use super::super::super::macros
::tests
::*;
147 use super::super::super::Parser
;
150 fn iter_for_flat_pairs() {
151 let pairs
= AbcParser
::parse(Rule
::a
, "abcde").unwrap();
154 pairs
.flatten().map(|p
| p
.as_rule()).collect
::<Vec
<Rule
>>(),
155 vec
![Rule
::a
, Rule
::b
, Rule
::c
]
160 fn double_ended_iter_for_flat_pairs() {
161 let pairs
= AbcParser
::parse(Rule
::a
, "abcde").unwrap();
166 .map(|p
| p
.as_rule())
167 .collect
::<Vec
<Rule
>>(),
168 vec
![Rule
::c
, Rule
::b
, Rule
::a
]