blob: 192d2251ea6866bf52e49462200b373daeb3beb9 [file] [log] [blame]
#ifndef __COMMON_H__
#define __COMMON_H__
#include <stddef.h>
#include <time.h>
#include <stdlib.h>
#if !defined(_MSC_VER) && !defined(__MINGW32__)
# include <sys/time.h>
#endif
/* Structures */
typedef struct {
size_t length;
double* data;
} dvector;
typedef struct {
size_t length;
unsigned char* data;
} bitvector;
typedef struct {
size_t count;
dvector* data;
} dvarray;
typedef enum
{
CODERATE_UNDEF = 0,
CODERATE_1D2 = 1,
CODERATE_2D3 = 2,
CODERATE_3D4 = 3,
CODERATE_5D6 = 4,
CODERATE_7D8 = 5
} coderate_tt;
#define MAX_Nways 128
#define MAX_punct 7
#define MAX_history 150-7
typedef struct
{
size_t Nbits;
size_t Nways;
size_t Delay;
unsigned char punct1[MAX_punct];
unsigned char punct2[MAX_punct];
size_t n_in;
unsigned char Tabl_X[MAX_Nways];
unsigned char Tabl_Y[MAX_Nways];
double Metr[MAX_Nways];
unsigned char history[MAX_Nways][MAX_history];
} param_viterbi_t;
/* Forward declarations */
static inline void dvarray_init(dvarray* array, size_t count, size_t vlength);
static inline void dvarray_clear(dvarray* array);
/* Inline functions */
static inline void dvector_clear(dvector* vector)
{
free(vector->data);
vector->length = 0;
vector->data = NULL;
}
static inline void bitvector_clear(bitvector* vector)
{
free(vector->data);
vector->length = 0;
vector->data = NULL;
}
static inline void dvector_init(dvector* vector, size_t length)
{
vector->length = length;
if (length) {
vector->data = (double*)malloc(length*sizeof(double));
memset(vector->data, 0, length*sizeof(double));
} else {
vector->data = NULL;
}
}
static inline void bitvector_init(bitvector* vector, size_t length)
{
vector->length = length;
if (length) {
vector->data = (unsigned char*)malloc(length*sizeof(unsigned char));
memset(vector->data, 0, length*sizeof(char));
} else {
vector->data = NULL;
}
}
static inline void dvarray_init(dvarray* array, size_t count, size_t vlength)
{
size_t i;
array->count = count;
if (count) {
array->data = (dvector*)malloc(count*sizeof(dvector));
} else {
array->data = NULL;
}
for (i=0; i<count; ++i) {
dvector_init(&array->data[i], vlength);
}
}
static inline void dvarray_clear(dvarray* array)
{
size_t i;
for (i=0; i<array->count; ++i) {
dvector_clear(&array->data[i]);
}
free(array->data);
array->count = 0;
array->data = NULL;
}
static inline double sTime()
#if !defined(_MSC_VER) && !defined(__MINGW32__)
{ static struct timeval this_tv;
static struct timezone dumbTZ;
double t;
gettimeofday(&this_tv, &dumbTZ);
t = this_tv.tv_sec + 0.000001*this_tv.tv_usec;
return t;
}
#else
{
return clock() / (double)CLOCKS_PER_SEC;
}
#endif
#endif /* __COMMON_H__ */