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