// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CSSParserTokenRange_h
#define CSSParserTokenRange_h

#include "core/CoreExport.h"
#include "core/css/parser/CSSParserToken.h"
#include "wtf/Allocator.h"
#include "wtf/Vector.h"

namespace blink {

CORE_EXPORT extern const CSSParserToken& staticEOFToken;

// A CSSParserTokenRange is an iterator over a subrange of a vector of
// CSSParserTokens. Accessing outside of the range will return an endless stream
// of EOF tokens. This class refers to half-open intervals [first, last).
class CORE_EXPORT CSSParserTokenRange {
  DISALLOW_NEW();

 public:
  template <size_t inlineBuffer>
  CSSParserTokenRange(const Vector<CSSParserToken, inlineBuffer>& vector)
      : m_first(vector.begin()), m_last(vector.end()) {}

  // This should be called on a range with tokens returned by that range.
  CSSParserTokenRange makeSubRange(const CSSParserToken* first,
                                   const CSSParserToken* last) const;

  bool atEnd() const { return m_first == m_last; }
  const CSSParserToken* end() const { return m_last; }

  const CSSParserToken& peek(unsigned offset = 0) const {
    if (m_first + offset >= m_last)
      return staticEOFToken;
    return *(m_first + offset);
  }

  const CSSParserToken& consume() {
    if (m_first == m_last)
      return staticEOFToken;
    return *m_first++;
  }

  const CSSParserToken& consumeIncludingWhitespace() {
    const CSSParserToken& result = consume();
    consumeWhitespace();
    return result;
  }

  // The returned range doesn't include the brackets
  CSSParserTokenRange consumeBlock();

  void consumeComponentValue();

  void consumeWhitespace() {
    while (peek().type() == WhitespaceToken)
      ++m_first;
  }

  String serialize() const;

  const CSSParserToken* begin() const { return m_first; }

  static void initStaticEOFToken();

 private:
  CSSParserTokenRange(const CSSParserToken* first, const CSSParserToken* last)
      : m_first(first), m_last(last) {}

  const CSSParserToken* m_first;
  const CSSParserToken* m_last;
};

}  // namespace blink

#endif  // CSSParserTokenRange_h
