Home | History | Annotate | Download | only in share
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <assert.h>
     18 #include "../include/lpicache.h"
     19 
     20 namespace ime_pinyin {
     21 
     22 LpiCache* LpiCache::instance_ = NULL;
     23 
     24 LpiCache::LpiCache() {
     25   lpi_cache_ = new LmaPsbItem[kFullSplIdStart * kMaxLpiCachePerId];
     26   lpi_cache_len_ = new uint16[kFullSplIdStart];
     27   assert(NULL != lpi_cache_);
     28   assert(NULL != lpi_cache_len_);
     29   for (uint16 id = 0; id < kFullSplIdStart; id++)
     30     lpi_cache_len_[id] = 0;
     31 }
     32 
     33 LpiCache::~LpiCache() {
     34   if (NULL != lpi_cache_)
     35     delete [] lpi_cache_;
     36 
     37   if (NULL != lpi_cache_len_)
     38     delete [] lpi_cache_len_;
     39 }
     40 
     41 LpiCache& LpiCache::get_instance() {
     42   if (NULL == instance_) {
     43     instance_ = new LpiCache();
     44     assert(NULL != instance_);
     45   }
     46   return *instance_;
     47 }
     48 
     49 bool LpiCache::is_cached(uint16 splid) {
     50   if (splid >= kFullSplIdStart)
     51     return false;
     52   return lpi_cache_len_[splid] != 0;
     53 }
     54 
     55 size_t LpiCache::put_cache(uint16 splid, LmaPsbItem lpi_items[],
     56                            size_t lpi_num) {
     57   uint16 num = kMaxLpiCachePerId;
     58   if (num > lpi_num)
     59     num = static_cast<uint16>(lpi_num);
     60 
     61   LmaPsbItem *lpi_cache_this = lpi_cache_ + splid * kMaxLpiCachePerId;
     62   for (uint16 pos = 0; pos < num; pos++)
     63     lpi_cache_this[pos] = lpi_items[pos];
     64 
     65   lpi_cache_len_[splid] = num;
     66   return num;
     67 }
     68 
     69 size_t LpiCache::get_cache(uint16 splid, LmaPsbItem lpi_items[],
     70                            size_t lpi_max) {
     71   if (lpi_max > lpi_cache_len_[splid])
     72     lpi_max = lpi_cache_len_[splid];
     73 
     74   LmaPsbItem *lpi_cache_this = lpi_cache_ + splid * kMaxLpiCachePerId;
     75   for (uint16 pos = 0; pos < lpi_max; pos++) {
     76     lpi_items[pos] = lpi_cache_this[pos];
     77   }
     78   return lpi_max;
     79 }
     80 
     81 }  // namespace ime_pinyin
     82