#ifndef HASKELL_IGRAPH_BYTESTRING
#define HASKELL_IGRAPH_BYTESTRING
#include "igraph.h"
typedef struct bytestring_t {
unsigned long int len;
char *value;
} bytestring_t;
typedef struct bsvector_t {
bytestring_t **data;
long int len;
} bsvector_t;
#define BSVECTOR_INIT_FINALLY(v, size) \
do { IGRAPH_CHECK(bsvector_init(v, size)); \
IGRAPH_FINALLY( (igraph_finally_func_t*) bsvector_destroy, v); } while (0)
/**
* \define STR
* Indexing string vectors
*
* This is a macro which allows to query the elements of a string vector in
* simpler way than \ref igraph_strvector_get(). Note this macro cannot be
* used to set an element, for that use \ref igraph_strvector_set().
* \param sv The string vector
* \param i The the index of the element.
* \return The element at position \p i.
*
* Time complexity: O(1).
*/
#define BS(sv,i) ((const bytestring_t *)((sv).data[(i)]))
int bsvector_init(bsvector_t *sv, long int len);
void bsvector_destroy(bsvector_t *sv);
void bsvector_get(const bsvector_t *sv, long int idx, bytestring_t **value);
int bsvector_set(bsvector_t *sv, long int idx, const bytestring_t *value);
void bsvector_remove_section(bsvector_t *v, long int from, long int to);
void bsvector_remove(bsvector_t *v, long int elem);
/*
void bsvector_move_interval(bsvector_t *v, long int begin,
long int end, long int to) {
long int i;
assert(v != 0);
assert(v->data != 0);
for (i=to; i<to+end-begin; i++) {
if (v->data[i] != 0) {
destroy_bytestring(v->data[i]);
}
}
for (i=0; i<end-begin; i++) {
if (v->data[begin+i] != 0) {
size_t len=strlen(v->data[begin+i])+1;
v->data[to+i]=igraph_Calloc(len, char);
memcpy(v->data[to+i], v->data[begin+i], sizeof(char)*len);
}
}
}
*/
int bsvector_copy(bsvector_t *to, const bsvector_t *from);
int bsvector_append(bsvector_t *to, const bsvector_t *from);
void bsvector_clear(bsvector_t *sv);
int bsvector_resize(bsvector_t* v, long int newsize);
/**
* \ingroup strvector
* \function igraph_strvector_permdelete
* \brief Removes elements from a string vector (for internal use)
*/
void bsvector_permdelete(bsvector_t *v, const igraph_vector_t *index,
long int nremove);
/**
* \ingroup strvector
* \function igraph_strvector_remove_negidx
* \brief Removes elements from a string vector (for internal use)
*/
void bsvector_remove_negidx(bsvector_t *v, const igraph_vector_t *neg,
long int nremove);
int bsvector_index(const bsvector_t *v, bsvector_t *newv,
const igraph_vector_t *idx);
long int bsvector_size(const bsvector_t *sv);
bytestring_t* new_bytestring(int n);
void destroy_bytestring(bytestring_t* str);
char* bytestring_to_char(bytestring_t* from);
bytestring_t* char_to_bytestring(char* from);
igraph_strvector_t* bsvector_to_strvector(bsvector_t* from);
bsvector_t* strvector_to_bsvector(igraph_strvector_t* from);
#endif