1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2007-2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_UNICODE_H_
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_UNICODE_H_
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <sys/types.h>
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \file
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Definitions and convenience functions for working with unicode.
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace unibrow {
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef unsigned int uchar;
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef unsigned char byte;
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The max length of the result of converting the case of a single
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * character.
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic const int kMaxMappingSize = 4;
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T, int size = 256>
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Predicate {
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline Predicate() { }
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline bool get(uchar c);
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class Test;
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool CalculateValue(uchar c);
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  struct CacheEntry {
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    inline CacheEntry() : code_point_(0), value_(0) { }
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    inline CacheEntry(uchar code_point, bool value)
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      : code_point_(code_point),
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        value_(value) { }
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uchar code_point_ : 21;
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    bool value_ : 1;
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kSize = size;
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kMask = kSize - 1;
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CacheEntry entries_[kSize];
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A cache used in case conversion.  It caches the value for characters
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// that either have no mapping or map to a single character independent
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// of context.  Characters that map to more than one character or that
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// map differently depending on context are always looked up.
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T, int size = 256>
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Mapping {
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline Mapping() { }
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline int get(uchar c, uchar n, uchar* result);
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class Test;
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int CalculateValue(uchar c, uchar n, uchar* result);
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  struct CacheEntry {
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    inline CacheEntry() : code_point_(kNoChar), offset_(0) { }
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    inline CacheEntry(uchar code_point, signed offset)
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      : code_point_(code_point),
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        offset_(offset) { }
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uchar code_point_;
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    signed offset_;
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    static const int kNoChar = (1 << 21) - 1;
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kSize = size;
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kMask = kSize - 1;
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CacheEntry entries_[kSize];
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass UnicodeData {
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class Test;
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int GetByteCount();
10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const uchar kMaxCodePoint;
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --- U t f   8 ---
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename Data>
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Buffer {
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline Buffer(Data data, unsigned length) : data_(data), length_(length) { }
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline Buffer() : data_(0), length_(0) { }
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Data data() { return data_; }
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  unsigned length() { return length_; }
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Data data_;
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  unsigned length_;
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Utf8 {
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static inline uchar Length(uchar chr);
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static inline unsigned Encode(char* out, uchar c);
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const byte* ReadBlock(Buffer<const char*> str, byte* buffer,
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      unsigned capacity, unsigned* chars_read, unsigned* offset);
1230d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  static uchar CalculateValue(const byte* str,
1240d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                              unsigned length,
1250d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                              unsigned* cursor);
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const uchar kBadChar = 0xFFFD;
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const unsigned kMaxEncodedSize   = 4;
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const unsigned kMaxOneByteChar   = 0x7f;
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const unsigned kMaxTwoByteChar   = 0x7ff;
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const unsigned kMaxThreeByteChar = 0xffff;
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const unsigned kMaxFourByteChar  = 0x1fffff;
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  template <unsigned s> friend class Utf8InputBuffer;
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  friend class Test;
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static inline uchar ValueOf(const byte* str,
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                              unsigned length,
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                              unsigned* cursor);
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --- C h a r a c t e r   S t r e a m ---
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CharacterStream {
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline uchar GetNext();
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline bool has_more() { return remaining_ != 0; }
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Note that default implementation is not efficient.
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  virtual void Seek(unsigned);
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  unsigned Length();
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  virtual ~CharacterStream() { }
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static inline bool EncodeCharacter(uchar c, byte* buffer, unsigned capacity,
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      unsigned& offset);
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static inline bool EncodeAsciiCharacter(uchar c, byte* buffer,
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      unsigned capacity, unsigned& offset);
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static inline bool EncodeNonAsciiCharacter(uchar c, byte* buffer,
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      unsigned capacity, unsigned& offset);
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static inline uchar DecodeCharacter(const byte* buffer, unsigned* offset);
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  virtual void Rewind() = 0;
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected:
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  virtual void FillBuffer() = 0;
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The number of characters left in the current buffer
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  unsigned remaining_;
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The current offset within the buffer
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  unsigned cursor_;
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The buffer containing the decoded characters.
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const byte* buffer_;
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --- I n p u t   B u f f e r ---
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Provides efficient access to encoded characters in strings.  It
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * does so by reading characters one block at a time, rather than one
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * character at a time, which gives string implementations an
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * opportunity to optimize the decoding.
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class Reader, class Input = Reader*, unsigned kSize = 256>
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass InputBuffer : public CharacterStream {
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  virtual void Rewind();
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline void Reset(Input input);
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void Seek(unsigned position);
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline void Reset(unsigned position, Input input);
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected:
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InputBuffer() { }
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  explicit InputBuffer(Input input) { Reset(input); }
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  virtual void FillBuffer();
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // A custom offset that can be used by the string implementation to
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // mark progress within the encoded string.
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  unsigned offset_;
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The input string
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Input input_;
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // To avoid heap allocation, we keep an internal buffer to which
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // the encoded string can write its characters.  The string
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // implementation is free to decide whether it wants to use this
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // buffer or not.
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  byte util_buffer_[kSize];
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --- U t f 8   I n p u t   B u f f e r ---
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <unsigned s = 256>
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Utf8InputBuffer : public InputBuffer<Utf8, Buffer<const char*>, s> {
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline Utf8InputBuffer() { }
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline Utf8InputBuffer(const char* data, unsigned length);
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  inline void Reset(const char* data, unsigned length) {
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    InputBuffer<Utf8, Buffer<const char*>, s>::Reset(
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Buffer<const char*>(data, length));
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
214bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Uppercase {
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool Is(uchar c);
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Lowercase {
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool Is(uchar c);
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Letter {
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool Is(uchar c);
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Space {
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool Is(uchar c);
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Number {
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool Is(uchar c);
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct WhiteSpace {
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool Is(uchar c);
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct LineTerminator {
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool Is(uchar c);
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct CombiningMark {
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool Is(uchar c);
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct ConnectorPunctuation {
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static bool Is(uchar c);
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct ToLowercase {
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kMaxWidth = 3;
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int Convert(uchar c,
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar n,
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar* result,
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     bool* allow_caching_ptr);
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct ToUppercase {
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kMaxWidth = 3;
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int Convert(uchar c,
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar n,
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar* result,
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     bool* allow_caching_ptr);
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Ecma262Canonicalize {
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kMaxWidth = 1;
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int Convert(uchar c,
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar n,
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar* result,
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     bool* allow_caching_ptr);
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Ecma262UnCanonicalize {
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kMaxWidth = 4;
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int Convert(uchar c,
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar n,
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar* result,
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     bool* allow_caching_ptr);
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct CanonicalizationRange {
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kMaxWidth = 1;
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static int Convert(uchar c,
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar n,
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     uchar* result,
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     bool* allow_caching_ptr);
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}  // namespace unibrow
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_UNICODE_H_
281