Bumping manifests a=b2g-bump
[gecko.git] / xpcom / ds / nsWhitespaceTokenizer.h
blob6b3046fe8df95fffac85a69835122a0d3068dbce
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"
11 #include "nsCRT.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;
19 public:
20 explicit nsTWhitespaceTokenizer(const SubstringType& aSource)
21 : mIter(aSource.Data(), aSource.Length())
22 , mEnd(aSource.Data() + aSource.Length(), aSource.Data(),
23 aSource.Length())
24 , mWhitespaceBeforeFirstToken(false)
25 , mWhitespaceAfterCurrentToken(false)
27 while (mIter < mEnd && IsWhitespace(*mIter)) {
28 mWhitespaceBeforeFirstToken = true;
29 ++mIter;
33 /**
34 * Checks if any more tokens are available.
36 bool hasMoreTokens() const
38 return mIter < mEnd;
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;
58 /**
59 * Returns the next token.
61 const DependentSubstringType nextToken()
63 const mozilla::RangedPtr<const CharType> tokenStart = mIter;
64 while (mIter < mEnd && !IsWhitespace(*mIter)) {
65 ++mIter;
67 const mozilla::RangedPtr<const CharType> tokenEnd = mIter;
68 mWhitespaceAfterCurrentToken = false;
69 while (mIter < mEnd && IsWhitespace(*mIter)) {
70 mWhitespaceAfterCurrentToken = true;
71 ++mIter;
73 return Substring(tokenStart.get(), tokenEnd.get());
76 private:
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>
87 public:
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>
100 public:
101 explicit nsCWhitespaceTokenizerTemplate(const nsCSubstring& aSource)
102 : nsTWhitespaceTokenizer<nsDependentCSubstring, IsWhitespace>(aSource)
107 typedef nsCWhitespaceTokenizerTemplate<> nsCWhitespaceTokenizer;
109 #endif /* __nsWhitespaceTokenizer_h */