// Copyright 2015 the V8 project 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 V8_UNICODE_CACHE_H_
#define V8_UNICODE_CACHE_H_

#include "src/base/macros.h"
#include "src/char-predicates.h"
#include "src/unicode.h"
#include "src/unicode-decoder.h"

namespace v8 {
namespace internal {

// Caching predicates used by scanners.
class UnicodeCache {
 public:
  UnicodeCache() {}
  typedef unibrow::Utf8Decoder<512> Utf8Decoder;

  StaticResource<Utf8Decoder>* utf8_decoder() { return &utf8_decoder_; }

  inline bool IsIdentifierStart(unibrow::uchar c);
  inline bool IsIdentifierPart(unibrow::uchar c);
  inline bool IsLineTerminator(unibrow::uchar c);
  inline bool IsLineTerminatorSequence(unibrow::uchar c, unibrow::uchar next);

  inline bool IsWhiteSpace(unibrow::uchar c);
  inline bool IsWhiteSpaceOrLineTerminator(unibrow::uchar c);

 private:
  unibrow::Predicate<IdentifierStart, 128> kIsIdentifierStart;
  unibrow::Predicate<IdentifierPart, 128> kIsIdentifierPart;
  unibrow::Predicate<unibrow::LineTerminator, 128> kIsLineTerminator;
  unibrow::Predicate<WhiteSpace, 128> kIsWhiteSpace;
  unibrow::Predicate<WhiteSpaceOrLineTerminator, 128>
      kIsWhiteSpaceOrLineTerminator;
  StaticResource<Utf8Decoder> utf8_decoder_;

  DISALLOW_COPY_AND_ASSIGN(UnicodeCache);
};

}  // namespace internal
}  // namespace v8

#endif  // V8_UNICODE_CACHE_H_
