/**********************************************************************
 * File:        char_altlist.h
 * Description: Declaration 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.
 *
 **********************************************************************/

#ifndef CHAR_ALT_LIST_H
#define CHAR_ALT_LIST_H

// The CharAltList class holds the list of class alternates returned from
// a character classifier. Each alternate represents a class ID.
// It inherits from the AltList class.
// The CharAltList owns a CharSet object that maps a class-id to a string.

#include "altlist.h"
#include "char_set.h"

namespace tesseract {
class CharAltList : public AltList {
 public:
  CharAltList(const CharSet *char_set, int max_alt = kMaxCharAlt);
  ~CharAltList();

  // Sort the alternate list based on cost
  void Sort();
  // insert a new alternate with the specified class-id, cost and tag
  bool Insert(int class_id, int cost, void *tag = NULL);
  // returns the cost of a specific class ID
  inline int ClassCost(int class_id) const {
    if (class_id_cost_ == NULL ||
        class_id < 0 ||
        class_id >= char_set_->ClassCount()) {
      return WORST_COST;
    }
    return class_id_cost_[class_id];
  }
  // returns the alternate class-id corresponding to an alternate index
  inline int Alt(int alt_idx) const { return class_id_alt_[alt_idx]; }
  // set the cost of a certain alternate
  void SetAltCost(int alt_idx, int cost) {
    alt_cost_[alt_idx] = cost;
    class_id_cost_[class_id_alt_[alt_idx]] = cost;
  }

 private:
  // character set object. Passed at construction time
  const CharSet *char_set_;
  // array of alternate class-ids
  int *class_id_alt_;
  // array of alternate costs
  int *class_id_cost_;
  // default max count of alternates
  static const int kMaxCharAlt = 256;
};
}

#endif  // CHAR_ALT_LIST_H