// 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_
