text: ///////////////////////////////////////////////////////////////////////
  // File:        workingpartset.h
  // Description: Class to hold a working set of partitions of the page
  //              during construction of text/image regions.
  // Author:      Ray Smith
  // Created:     Tue Ocr 28 17:21:01 PDT 2008
  //
  // (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 TESSERACT_TEXTORD_WORKINGPARSET_H_
  #define TESSERACT_TEXTORD_WORKINGPARSET_H_
  
  #include "blobbox.h"       // For TO_BLOCK_LIST and BLOCK_LIST.
  #include "colpartition.h"  // For ColPartition_LIST.
  
  namespace tesseract {
  
  // WorkingPartSet holds a working set of ColPartitions during transformation
  // from the grid-based storage to regions in logical reading order, and is
  // therefore only used during construction of the regions.
  class WorkingPartSet : public ELIST_LINK {
   public:
    WorkingPartSet() {
    }
    explicit WorkingPartSet(ColPartition* column)
      : column_(column), latest_part_(NULL), part_it_(&part_set_) {
    }
  
    // Simple accessors.
    ColPartition* column() const {
      return column_;
    }
    void set_column(ColPartition* col) {
      column_ = col;
    }
  
    // Add the partition to this WorkingPartSet. Partitions are generally
    // stored in the order in which they are received, but if the partition
    // has a SingletonPartner, make sure that it stays with its partner.
    void AddPartition(ColPartition* part);
  
    // Make blocks out of any partitions in this WorkingPartSet, and append
    // them to the end of the blocks list. bleft, tright and resolution give
    // the bounds and resolution of the source image, so that blocks can be
    // made to fit in the bounds.
    // All ColPartitions go in the used_parts list, as they need to be kept
    // around, but are no longer needed.
    void ExtractCompletedBlocks(const ICOORD& bleft, const ICOORD& tright,
                                int resolution, ColPartition_LIST* used_parts,
                                BLOCK_LIST* blocks, TO_BLOCK_LIST* to_blocks);
  
    // Insert the given blocks at the front of the completed_blocks_ list so
    // they can be kept in the correct reading order.
    void InsertCompletedBlocks(BLOCK_LIST* blocks, TO_BLOCK_LIST* to_blocks);
  
   private:
    // Convert the part_set_ into blocks, starting a new block at a break
    // in partnerships, or a change in linespacing (for text).
    void MakeBlocks(const ICOORD& bleft, const ICOORD& tright, int resolution,
                    ColPartition_LIST* used_parts);
  
    // The column that this working set applies to. Used by the caller.
    ColPartition* column_;
    // The most recently added partition.
    ColPartition* latest_part_;
    // All the partitions in the block that is currently under construction.
    ColPartition_LIST part_set_;
    // Iteratorn on part_set_ pointing to the most recent addition.
    ColPartition_IT part_it_;
    // The blocks that have been made so far and belong before the current block.
    BLOCK_LIST completed_blocks_;
    TO_BLOCK_LIST to_blocks_;
  };
  
  ELISTIZEH(WorkingPartSet)
  
  }  // namespace tesseract.
  
  #endif  // TESSERACT_TEXTORD_WORKINGPARSET_H_
  
  