/* -*-C-*-
 ********************************************************************************
 *
 * File:        states.h  (Formerly states.h)
 * Description:  Representations of search states
 * Author:       Mark Seaman, OCR Technology
 * Created:      Wed May 16 15:52:40 1990
 * Modified:     Tue May 21 16:26:21 1991 (Mark Seaman) marks@hpgrlt
 * Language:     C
 * Package:      N/A
 * Status:       Experimental (Do Not Distribute)
 *
 * (c) Copyright 1990, Hewlett-Packard Company.
 ** 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 STATES_H
#define STATES_H

/*----------------------------------------------------------------------
              I n c l u d e s
----------------------------------------------------------------------*/
#include "general.h"

/*----------------------------------------------------------------------
              T y p e s
----------------------------------------------------------------------*/
#define MAX_NUM_CHUNKS  64       /* Limit on pieces */

typedef struct
{
  uinT32 part1;
  uinT32 part2;
} STATE;

typedef int *SEARCH_STATE;       /* State variable for search */

                                 /* State variable for search */
typedef uinT8 PIECES_STATE[MAX_NUM_CHUNKS + 2];

/*----------------------------------------------------------------------
              F u n c t i o n s
----------------------------------------------------------------------*/
SEARCH_STATE bin_to_chunks(STATE *state, int num_joints);

void bin_to_pieces(STATE *state, int num_joints, PIECES_STATE pieces);

void insert_new_chunk(register STATE *state,
                      register int index,
                      int num_joints);

STATE *new_state(STATE *oldstate);

int ones_in_state(STATE *state, int num_joints);

void print_state(const char *label, STATE *state, int num_joints);

void set_n_ones(STATE *state, int n);

int compare_states(STATE *true_state, STATE *this_state, int *blob_index);

extern void free_state(STATE *);

/*
#if defined(__STDC__) || defined(__cplusplus)
# define	_ARGS(s) s
#else
# define	_ARGS(s) ()
#endif*/

/* states.c
void insert_new_chunk
  _ARGS((STATE *state,
  int index));

SEARCH_STATE bin_to_chunks
  _ARGS((STATE *state,
  int num_joints));

STATE *new_state
  _ARGS((STATE *oldstate));

int ones_in_state
  _ARGS((STATE *state,
  int num_joints));

void print_state
  _ARGS((char *label,
  STATE *state,
  int num_joints));

void set_n_ones
  _ARGS((STATE *state,
  int n));
int compare_states
  _ARGS((
STATE *true_state,
STATE *this_state,
int*   blob_index));

#undef _ARGS
*/
#endif
