/******************************************************************************
 **	Filename:    bitvec.h
 **	Purpose:     Routines for manipulating bit vectors
 **	Author:      Dan Johnson
 **	History:     Wed Mar  7 17:52:45 1990, DSJ, Created.
 **
 **	(c) Copyright Hewlett-Packard Company, 1988.
 ** 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   BITVEC_H
#define   BITVEC_H

#include "host.h"

/**----------------------------------------------------------------------------
          Include Files and Type Defines
----------------------------------------------------------------------------**/
#define BITSINLONG      32       /*no of bits in a long */
typedef uinT32 *BIT_VECTOR;

/**----------------------------------------------------------------------------
          Public Function Prototypes
----------------------------------------------------------------------------**/
#define zero_all_bits(array,length) \
{\
	register int			index;						/*temporary index*/\
\
for (index=0;index<length;index++)\
	array[index]=0;										/*zero all bits*/\
}

#define set_all_bits(array,length) \
{\
	register int			index;						/*temporary index*/\
\
for (index=0;index<length;index++)\
	array[index]= ~0;									/*set all bits*/\
}

#define copy_all_bits(source,dest,length) \
{\
	register int			index;						/*temporary index*/\
\
for (index=0;index<length;index++)\
	dest[index]=source[index];							/*copy all bits*/\
}

#define SET_BIT(array,bit) (array[bit/BITSINLONG]|=1<<(bit&(BITSINLONG-1)))

#define reset_bit(array,bit) (array[bit/BITSINLONG]&=~(1<<(bit&(BITSINLONG-1))))

#define test_bit(array,bit) (array[bit/BITSINLONG] & (1<<(bit&(BITSINLONG-1))))

#define WordsInVectorOfSize(NumBits) \
(((NumBits) + BITSINLONG - 1) / BITSINLONG)

/*--------------------------------------------------------------------------
        Public Function Prototypes
--------------------------------------------------------------------------*/
BIT_VECTOR ExpandBitVector(BIT_VECTOR Vector, int NewNumBits);

void FreeBitVector(BIT_VECTOR BitVector);

int hamming_distance(uinT32* array1, uinT32* array2, int length);

BIT_VECTOR NewBitVector(int NumBits);
/*
#if defined(__STDC__) || defined(__cplusplus)
# define _ARGS(s) s
#else
# define _ARGS(s) ()
#endif*/

/* bitvec.c
BIT_VECTOR ExpandBitVector
  _ARGS((BIT_VECTOR Vector,
  int NewNumBits));

void FreeBitVector
  _ARGS((BIT_VECTOR BitVector));

int hamming_distance
  _ARGS((unsigned long *array1,
  unsigned long *array2,
  int length));

BIT_VECTOR NewBitVector
  _ARGS((int NumBits));

#undef _ARGS
*/
#endif
