1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef __nsWhitespaceTokenizer_h
7 #define __nsWhitespaceTokenizer_h
9 #include "mozilla/RangedPtr.h"
10 #include "nsDependentSubstring.h"
13 template<typename DependentSubstringType
, bool IsWhitespace(char16_t
)>
14 class nsTWhitespaceTokenizer
16 typedef typename
DependentSubstringType::char_type CharType
;
17 typedef typename
DependentSubstringType::substring_type SubstringType
;
20 explicit nsTWhitespaceTokenizer(const SubstringType
& aSource
)
21 : mIter(aSource
.Data(), aSource
.Length())
22 , mEnd(aSource
.Data() + aSource
.Length(), aSource
.Data(),
24 , mWhitespaceBeforeFirstToken(false)
25 , mWhitespaceAfterCurrentToken(false)
27 while (mIter
< mEnd
&& IsWhitespace(*mIter
)) {
28 mWhitespaceBeforeFirstToken
= true;
34 * Checks if any more tokens are available.
36 bool hasMoreTokens() const
42 * Returns true if there is whitespace prior to the first token.
44 bool whitespaceBeforeFirstToken() const
46 return mWhitespaceBeforeFirstToken
;
50 * Returns true if there is any whitespace after the current token.
51 * This is always true unless we're reading the last token.
53 bool whitespaceAfterCurrentToken() const
55 return mWhitespaceAfterCurrentToken
;
59 * Returns the next token.
61 const DependentSubstringType
nextToken()
63 const mozilla::RangedPtr
<const CharType
> tokenStart
= mIter
;
64 while (mIter
< mEnd
&& !IsWhitespace(*mIter
)) {
67 const mozilla::RangedPtr
<const CharType
> tokenEnd
= mIter
;
68 mWhitespaceAfterCurrentToken
= false;
69 while (mIter
< mEnd
&& IsWhitespace(*mIter
)) {
70 mWhitespaceAfterCurrentToken
= true;
73 return Substring(tokenStart
.get(), tokenEnd
.get());
77 mozilla::RangedPtr
<const CharType
> mIter
;
78 const mozilla::RangedPtr
<const CharType
> mEnd
;
79 bool mWhitespaceBeforeFirstToken
;
80 bool mWhitespaceAfterCurrentToken
;
83 template<bool IsWhitespace(char16_t
) = NS_IsAsciiWhitespace
>
84 class nsWhitespaceTokenizerTemplate
85 : public nsTWhitespaceTokenizer
<nsDependentSubstring
, IsWhitespace
>
88 explicit nsWhitespaceTokenizerTemplate(const nsSubstring
& aSource
)
89 : nsTWhitespaceTokenizer
<nsDependentSubstring
, IsWhitespace
>(aSource
)
94 typedef nsWhitespaceTokenizerTemplate
<> nsWhitespaceTokenizer
;
96 template<bool IsWhitespace(char16_t
) = NS_IsAsciiWhitespace
>
97 class nsCWhitespaceTokenizerTemplate
98 : public nsTWhitespaceTokenizer
<nsDependentCSubstring
, IsWhitespace
>
101 explicit nsCWhitespaceTokenizerTemplate(const nsCSubstring
& aSource
)
102 : nsTWhitespaceTokenizer
<nsDependentCSubstring
, IsWhitespace
>(aSource
)
107 typedef nsCWhitespaceTokenizerTemplate
<> nsCWhitespaceTokenizer
;
109 #endif /* __nsWhitespaceTokenizer_h */