text: /**********************************************************************
   * File:        char_altlist.cpp
   * Description: Implementation of a Character Alternate List Class
   * Author:    Ahmad Abdulkader
   * Created:   2007
   *
   * (C) Copyright 2008, Google Inc.
   ** Licensed under the Apache License, Version 2.0 (the "License");
   ** you may not use this file except in compliance with the License.
   ** You may obtain a copy of the License at
   ** http://www.apache.org/licenses/LICENSE-2.0
   ** Unless required by applicable law or agreed to in writing, software
   ** distributed under the License is distributed on an "AS IS" BASIS,
   ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   ** See the License for the specific language governing permissions and
   ** limitations under the License.
   *
   **********************************************************************/
  
  #include "char_altlist.h"
  
  namespace tesseract {
  
  // The CharSet is not class owned and must exist for
  // the life time of this class
  CharAltList::CharAltList(const CharSet *char_set, int max_alt)
      : AltList(max_alt) {
    char_set_ = char_set;
    max_alt_ = max_alt;
    class_id_alt_ = NULL;
    class_id_cost_ = NULL;
  }
  
  CharAltList::~CharAltList() {
    if (class_id_alt_ != NULL) {
      delete []class_id_alt_;
      class_id_alt_ = NULL;
    }
  
    if (class_id_cost_ != NULL) {
      delete []class_id_cost_;
      class_id_cost_ = NULL;
    }
  }
  
  // Insert a new char alternate
  bool CharAltList::Insert(int class_id, int cost, void *tag) {
    // validate class ID
    if (class_id < 0 || class_id >= char_set_->ClassCount()) {
      return false;
    }
  
    // allocate buffers if nedded
    if (class_id_alt_ == NULL || alt_cost_ == NULL) {
      class_id_alt_ = new int[max_alt_];
      alt_cost_ = new int[max_alt_];
      alt_tag_ = new void *[max_alt_];
  
      memset(alt_tag_, 0, max_alt_ * sizeof(*alt_tag_));
    }
  
    if (class_id_cost_ == NULL) {
      int class_cnt = char_set_->ClassCount();
  
      class_id_cost_ = new int[class_cnt];
  
      for (int ich = 0; ich < class_cnt; ich++) {
        class_id_cost_[ich] = WORST_COST;
      }
    }
  
    if (class_id < 0 || class_id >= char_set_->ClassCount()) {
      return false;
    }
  
    // insert the alternate
    class_id_alt_[alt_cnt_] = class_id;
    alt_cost_[alt_cnt_] = cost;
    alt_tag_[alt_cnt_] = tag;
  
    alt_cnt_++;
  
    class_id_cost_[class_id] = cost;
  
    return true;
  }
  
  // sort the alternate Desc. based on prob
  void CharAltList::Sort() {
    for (int alt_idx = 0; alt_idx < alt_cnt_; alt_idx++) {
      for (int alt = alt_idx + 1; alt < alt_cnt_; alt++) {
        if (alt_cost_[alt_idx] > alt_cost_[alt]) {
          int temp = class_id_alt_[alt_idx];
          class_id_alt_[alt_idx] = class_id_alt_[alt];
          class_id_alt_[alt] = temp;
  
          temp = alt_cost_[alt_idx];
          alt_cost_[alt_idx] = alt_cost_[alt];
          alt_cost_[alt] = temp;
  
          void *tag = alt_tag_[alt_idx];
          alt_tag_[alt_idx] = alt_tag_[alt];
          alt_tag_[alt] = tag;
        }
      }
    }
  }
  }
  