// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_VM_UNIBROW_H_ #define RUNTIME_VM_UNIBROW_H_ #include #include "vm/globals.h" /** * \file * Definitions and convenience functions for working with unicode. */ namespace unibrow { // A cache used in case conversion. It caches the value for characters // that either have no mapping or map to a single character independent // of context. Characters that map to more than one character or that // map differently depending on context are always looked up. template class Mapping { public: inline Mapping() {} inline intptr_t get(int32_t c, int32_t n, int32_t* result); private: friend class Test; intptr_t CalculateValue(int32_t c, int32_t n, int32_t* result); struct CacheEntry { inline CacheEntry() : code_point_(kNoChar), offset_(0) {} inline CacheEntry(int32_t code_point, signed offset) : code_point_(code_point), offset_(offset) {} int32_t code_point_; signed offset_; static const intptr_t kNoChar = (1 << 21) - 1; }; static const intptr_t kSize = size; static const intptr_t kMask = kSize - 1; CacheEntry entries_[kSize]; }; struct Letter { static bool Is(int32_t c); }; struct Ecma262Canonicalize { static const intptr_t kMaxWidth = 1; static intptr_t Convert(int32_t c, int32_t n, int32_t* result, bool* allow_caching_ptr); }; struct Ecma262UnCanonicalize { static const intptr_t kMaxWidth = 4; static intptr_t Convert(int32_t c, int32_t n, int32_t* result, bool* allow_caching_ptr); }; struct CanonicalizationRange { static const intptr_t kMaxWidth = 1; static intptr_t Convert(int32_t c, int32_t n, int32_t* result, bool* allow_caching_ptr); }; } // namespace unibrow #endif // RUNTIME_VM_UNIBROW_H_