// 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_INL_H_
#define RUNTIME_VM_UNIBROW_INL_H_

#include "vm/unibrow.h"

#include "platform/assert.h"

namespace unibrow {

template <class T, intptr_t s>
intptr_t Mapping<T, s>::get(int32_t c, int32_t n, int32_t* result) {
  CacheEntry entry = entries_[c & kMask];
  if (entry.code_point_ == c) {
    if (entry.offset_ == 0) {
      return 0;
    } else {
      result[0] = c + entry.offset_;
      return 1;
    }
  } else {
    return CalculateValue(c, n, result);
  }
}

template <class T, intptr_t s>
intptr_t Mapping<T, s>::CalculateValue(int32_t c, int32_t n, int32_t* result) {
  bool allow_caching = true;
  intptr_t length = T::Convert(c, n, result, &allow_caching);
  if (allow_caching) {
    if (length == 1) {
      entries_[c & kMask] = CacheEntry(c, result[0] - c);
      return 1;
    } else {
      entries_[c & kMask] = CacheEntry(c, 0);
      return 0;
    }
  } else {
    return length;
  }
}

}  // namespace unibrow

#endif  // RUNTIME_VM_UNIBROW_INL_H_
