123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- /*****************************************************************************
- * Hvector.h
- *****************************************************************************
- *
- * Project: HALCON/C
- * Description: HALCON/C implementation of HDevelop vectors
- *
- * (c) 2014-2020 by MVTec Software GmbH
- * www.mvtec.com
- *
- ****************************************************************************/
- #ifndef HVECTOR_H
- #define HVECTOR_H
- #if defined(__cplusplus)
- extern "C" {
- #endif
- /*
- * The data structure Hvector is used to the vector functionality of the
- * hdevelop language. Creating, access and deletion must only be done with the
- * supplied procedures.
- */
- typedef Hlong Hvector; /* Handle implementation of vector */
- typedef enum {
- eVector=0x05EC0000,eTupleVector,eTupleLeaf,eObjectVector,eObjectLeaf
- } Hvectype;
- #define HVECTOR_UNDEF 0
- /**************************************************************************
- * Hvector functionality
- *************************************************************************/
- /* create_obj_vector creates an empty vector of dimension dim. The vector is
- * returned in vec and can contain objects only.*/
- LIntExport Herror V_create_obj_vector(Hlong dim, Hvector *H_RESTRICT vec);
- /* create_tuple_vector creates an empty vector of dimension dim. The vector is
- * returned in vec and can contain tuples only.*/
- LIntExport Herror V_create_tuple_vector(Hlong dim, Hvector *H_RESTRICT vec);
- /* destroy_vector frees the vector, its subvectors and leafs of any type and
- * dimension. */
- LIntExport Herror V_destroy_vector(Hvector vec);
- /* copy_vector returns a copy of src in dest. Deep copy is performed. */
- LIntExport Herror V_copy_vector(Hvector const src, Hvector *H_RESTRICT dest);
- /* set_vector_elem sets a sub vector subvec in vector vec. Therefore,
- * index addresses a sub vector that gets replaced by subvec. The old sub
- * vector is freed if existing. Otherwise, vec is extended accordingly (and
- * initialized with empty elements) to fulfill index.(self modifying)
- * Precondition: type(subvec) == type(vec) && dim(vec) == dim(subvec)+|index|
- */
- LIntExport Herror V_set_vector_elem(Hvector vec, Htuple const vec_idx,
- Hvector const subvec);
- /* set_vector_obj sets a iconic object obj in vector vec. Therefore,
- * vec_idx addresses an object in vec that gets replaced by obj. The old
- * iconic object in vec is freed if existing. Otherwise, vec is extended
- * accordingly (and initialized with empty elements) to fulfill vec_idx.(self
- * modifying)
- * Precondition: type(vec) == eObjectVector && dim(vec) == dim(subvec)+|index|
- */
- LIntExport Herror V_set_vector_obj(Hobject const obj, Hvector vec,
- Htuple const vec_idx);
- /* set_vector_tuple sets a tuple tpl in vector vec. Therefore,
- * vec_idx addresses a tuple in vec that gets replaced by obj. The old tuple
- * in vec is freed if existing. Otherwise, vec is extended accordingly (and
- * initialized with empty elements) to fulfill vec_idx.(self modifying)
- * Precondition: type(vec) == eTupleVector && dim(vec) == |index|
- */
- LIntExport Herror V_set_vector_tuple(Hvector vec, Htuple const vec_idx,
- Htuple const tpl);
- /* set_vector_tuple_elem executes a self modifying tuple_replace in the indexed
- * tuple in vec. vec_idx is a tuple of n=dim elements and indexes the tuple
- * in vec. tpl_idx contains the tuple indices to be replaced. val contains
- * the values to set.
- * If the length of any sub vector indexed by vec_idx is not sufficient,
- * set_vector_tuple_elem extends it automatically (initialized with empty
- * elements).
- * Precondition: type(vec) == eTupleVector && dim(vec) == |vec_idx|. */
- LIntExport Herror V_set_vector_tuple_elem(Hvector vec, Htuple const vec_idx,
- Htuple const tpl_idx,
- Htuple const val);
- /* get_vector_elem returns a copy of the sub vector of vec at index. The
- * error H_ERR_WIPV2 is returned if any value of index addresses an element
- * of a sub vector of vec beyond its length.
- * Remark: dim(subvec) = dim(vec)-|index|
- * type(subvec) = type(vec) */
- LIntExport Herror V_get_vector_elem(Hvector const vec, Htuple const index,
- Hvector *H_RESTRICT subvec);
- /* get_vector_obj returns a copy of an iconic object of vec at index. The
- * error H_ERR_WIPV2 is returned if any value of index addresses an element of a
- * sub vector of vec beyond its length.
- * Precondition: dim(vec) == |index| && type(vec) == eObjectVector */
- LIntExport Herror V_get_vector_obj(Hobject *H_RESTRICT obj, Hvector const vec,
- Htuple const index);
- /* get_vector_tuple returns a copy of a tuple of vector vec at index. The
- * error H_ERR_WIPV2 is returned if any value of index addresses an element of
- * a sub vector of vec beyond its length.
- * Precondition: dim(vec) == |index| && type(vec) == eTupleVector */
- LIntExport Herror V_get_vector_tuple( Hvector const vec, Htuple const index,
- Htuple *H_RESTRICT tpl);
- /* concat_vector appends vec2 at vec1 and returns the concatenated vector in
- * concat. vec1 and vec2 have to be of same dimension and type. */
- LIntExport Herror V_concat_vector(Hvector const vec1, Hvector const vec2,
- Hvector *H_RESTRICT vec_concat);
- /* insert_vector_elem inserts a vector ins at position ins_idx into a
- * sub vector of vec, indexed by vec_idx.
- * Different to set_vector_elem, the length of the sub vector indexed by
- * vec_idx gets increased by one. (self modifying)
- * Precondition: dim(vec) == dim(ins)+|vec_ins|
- * type(ins) == type(vec)
- * |ins_idx| == 1 */
- LIntExport Herror V_insert_vector_elem(Hvector vec, Htuple const vec_idx,
- Htuple const ins_idx,
- Hvector const ins);
- /* remove_vector_elem is the counterpart of insert_vector_elem. It frees all
- * contents at position rmv_idx of a sub vector indexed by vec_idx.
- * If the sub vector indexed by vec_idx does not exist, it gets created.
- * The length of the sub vector indexed by vec_idx gets decreased by one,
- * when rmv_idx is smaller than the length of the sub vector. (self modifying)
- * Precondition: dim(vec)>=|vec_idx| */
- LIntExport Herror V_remove_vector_elem(Hvector vec, Htuple const vec_idx,
- Htuple const rmv_idx);
- /* clear_vector frees all contents of a sub vector of vec and makes it empty.
- * The sub vector is indexed by 'index'. Type and dimension of the sub
- * vector remain. (self modifying)
- * Precondition: dim(vec)>=|index| */
- LIntExport Herror V_clear_vector(Hvector vec, Htuple const index);
- /* insert_vector_obj inserts an iconic object obj at position ins_idx into a
- * sub vector of vec, indexed by vec_idx.
- * Different to set_vector_obj, the length of the sub vector indexed by
- * vec_idx gets increased by one. (self modifying)
- * Precondition: dim(vec) == |vec_ins|
- * type(vec) == eObjectVector
- * |ins_idx| == 1 */
- LIntExport Herror V_insert_vector_obj(Hobject const obj, Hvector vec,
- Htuple const vec_idx,Htuple const ins_idx);
- /* insert_vector_tupel inserts a tuple tpl at position ins_idx into a
- * sub vector of vec, indexed by vec_idx.
- * Different to set_vector_tuple, the length of the sub vector indexed by
- * vec_idx gets increased by one. (self modifying)
- * Precondition: dim(vec) == |vec_ins|
- * type(vec) == eTupleVector
- * |ins_idx| == 1 */
- LIntExport Herror V_insert_vector_tuple(Hvector vec, Htuple const vec_idx,
- Htuple const ins_idx, Htuple const tpl);
- /* convert_vector_to_tuple concatenates the tuple leafs of a tuple vector
- * vec into one tuple tpl.
- * Precondition: type(vec) == eTupleVector */
- LIntExport Herror V_convert_vector_to_tuple( Hvector const vec,
- Htuple *H_RESTRICT tpl);
- /* convert_tuple_to_vector_1d separates the tuple elements of tpl according
- * to the length values in lengths into new sub tuples and generates a new
- * tuple vector vec with all these tuples as leafs. If lengths contains only
- * one value, tpl is separated into tuples of the same length (with the last
- * tuple containing the residuum).
- * Precondition: |lengths|==1 || sum(lengths)==|tpl|
- * dim(vec)=1, type(vec)=eTupleVector */
- LIntExport Herror V_convert_tuple_to_vector_1d( Htuple const tpl,
- Htuple const lengths,
- Hvector *H_RESTRICT vec);
- /* vector_equal returns TRUE if both vectors are identic. I.e.
- * both vectors have the same 'tree', the same type, and test_equal_obj
- * (tuple_equal, respectively) is true for all leafs. Else, equal is set
- * to FALSE.*/
- LIntExport Herror V_vector_equal(Hvector const vec1, Hvector const vec2,
- HBOOL *H_RESTRICT equal);
- /* vector_dim returns the dimensionality of the vector vec */
- LIntExport Herror V_vector_dim(Hvector const vec, Hlong *H_RESTRICT dim);
- /* vector type returns the type of the vector. eTupleVector, eObjectVector
- * are possible values */
- LIntExport Herror V_vector_type(Hvector const vec, Hvectype *H_RESTRICT type);
- /* vector_length returns the number of elements in vec */
- LIntExport Herror V_vector_length(Hvector const vec,
- Hlong *H_RESTRICT length);
- /* V_sub_vector_length returns the number of elements of a sub vector of vec,
- * indexed by vec_idx. Passing an empty tuple for vec_idx receives the same
- * result as V_vector_length. */
- LIntExport Herror V_sub_vector_length(Hvector const vec, Htuple const vec_idx,
- Hlong *H_RESTRICT length);
- /* Some printf auxiliary functions for debug support. They allow to transform
- * the basic HALCON/C data types into readable strings.
- * str points to a pre-allocated buffer of size bytes.
- * Upon successful completion, the Hsnprintf_* functions shall return the
- * number of bytes that would be written to str had size been sufficiently
- * large excluding the terminating null byte. If an output error was
- * encountered, these functions shall return a negative value.*/
- LIntExport int Hsnprintf_Hvector( char *H_RESTRICT str, Hlong size,
- Hvector const vec);
- LIntExport int Hsnprintf_Htuple( char *H_RESTRICT str, Hlong size,
- Htuple const tpl);
- LIntExport int Hsnprintf_Hobject( char *H_RESTRICT str, Hlong size,
- Hobject const obj);
- #if defined(__cplusplus)
- }
- #endif
- #endif
|