blob: 565a9a871cfdb99c22432b15a992889255f05825 [file] [log] [blame] [edit]
// 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 <sys/types.h>
#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 T, intptr_t size = 256>
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_