Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
argo
excit
Commits
60103e54
Commit
60103e54
authored
Jan 07, 2019
by
Nicolas Denoyelle
Browse files
split excit.c in iterator component files
parent
4e08270a
Changes
14
Expand all
Hide whitespace changes
Inline
Side-by-side
src/Makefile.am
View file @
60103e54
...
...
@@ -2,6 +2,6 @@ AM_CFLAGS = -Wall -Werror -pedantic
lib_LTLIBRARIES
=
libexcit.la
libexcit_la_SOURCES
=
excit.c
excit.h
libexcit_la_SOURCES
=
excit.c
slice.c prod.c cons.c repeat.c hilbert2d.c range.c
include_HEADERS
=
excit.h
src/cons.c
0 → 100644
View file @
60103e54
#include "excit.h"
#include "dev/excit.h"
#include "cons.h"
static
void
circular_fifo_add
(
struct
circular_fifo_s
*
fifo
,
ssize_t
elem
)
{
if
(
fifo
->
size
==
fifo
->
length
)
{
fifo
->
start
=
(
fifo
->
start
+
1
)
%
fifo
->
length
;
fifo
->
end
=
(
fifo
->
end
+
1
)
%
fifo
->
length
;
}
else
{
fifo
->
end
=
(
fifo
->
end
+
1
)
%
fifo
->
length
;
fifo
->
size
++
;
}
fifo
->
buffer
[
fifo
->
end
]
=
elem
;
}
static
void
circular_fifo_dump
(
const
struct
circular_fifo_s
*
fifo
,
ssize_t
*
vals
)
{
ssize_t
i
;
ssize_t
j
;
for
(
i
=
0
,
j
=
fifo
->
start
;
i
<
fifo
->
size
;
i
++
)
{
vals
[
i
]
=
fifo
->
buffer
[
j
];
j
=
(
j
+
1
)
%
fifo
->
length
;
}
}
static
int
cons_it_alloc
(
excit_t
data
)
{
struct
cons_it_s
*
it
=
(
struct
cons_it_s
*
)
data
->
data
;
it
->
it
=
NULL
;
it
->
n
=
0
;
it
->
fifo
.
length
=
0
;
it
->
fifo
.
start
=
0
;
it
->
fifo
.
end
=
-
1
;
it
->
fifo
.
size
=
0
;
it
->
fifo
.
buffer
=
NULL
;
return
EXCIT_SUCCESS
;
}
static
void
cons_it_free
(
excit_t
data
)
{
struct
cons_it_s
*
it
=
(
struct
cons_it_s
*
)
data
->
data
;
excit_free
(
it
->
it
);
free
(
it
->
fifo
.
buffer
);
}
static
int
cons_it_copy
(
excit_t
ddst
,
const
excit_t
dsrc
)
{
struct
cons_it_s
*
dst
=
(
struct
cons_it_s
*
)
ddst
->
data
;
const
struct
cons_it_s
*
src
=
(
const
struct
cons_it_s
*
)
dsrc
->
data
;
excit_t
copy
=
excit_dup
(
src
->
it
);
if
(
!
copy
)
return
-
EXCIT_EINVAL
;
dst
->
it
=
copy
;
dst
->
n
=
src
->
n
;
dst
->
fifo
.
length
=
src
->
fifo
.
length
;
dst
->
fifo
.
start
=
src
->
fifo
.
start
;
dst
->
fifo
.
end
=
src
->
fifo
.
end
;
dst
->
fifo
.
size
=
src
->
fifo
.
size
;
dst
->
fifo
.
buffer
=
(
ssize_t
*
)
malloc
(
src
->
fifo
.
length
*
sizeof
(
ssize_t
));
if
(
!
dst
->
fifo
.
buffer
)
{
excit_free
(
copy
);
return
-
EXCIT_ENOMEM
;
}
for
(
int
i
=
0
;
i
<
dst
->
fifo
.
length
;
i
++
)
dst
->
fifo
.
buffer
[
i
]
=
src
->
fifo
.
buffer
[
i
];
return
EXCIT_SUCCESS
;
}
static
int
cons_it_size
(
const
excit_t
data
,
ssize_t
*
size
)
{
const
struct
cons_it_s
*
it
=
(
const
struct
cons_it_s
*
)
data
->
data
;
ssize_t
tmp_size
=
0
;
int
err
=
excit_size
(
it
->
it
,
&
tmp_size
);
if
(
err
)
return
err
;
*
size
=
tmp_size
-
(
it
->
n
-
1
);
return
EXCIT_SUCCESS
;
}
static
int
cons_it_split
(
const
excit_t
data
,
ssize_t
n
,
excit_t
*
results
)
{
ssize_t
size
;
int
err
=
cons_it_size
(
data
,
&
size
);
if
(
err
)
return
err
;
if
(
size
<
n
)
return
-
EXCIT_EDOM
;
if
(
!
results
)
return
EXCIT_SUCCESS
;
excit_t
range
=
excit_alloc
(
EXCIT_RANGE
);
if
(
!
range
)
return
-
EXCIT_ENOMEM
;
err
=
excit_range_init
(
range
,
0
,
size
-
1
,
1
);
if
(
err
)
goto
error1
;
err
=
excit_split
(
range
,
n
,
results
);
if
(
err
)
goto
error1
;
int
i
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
excit_t
tmp
,
tmp2
;
tmp
=
excit_dup
(
data
);
if
(
!
tmp
)
goto
error2
;
tmp2
=
results
[
i
];
results
[
i
]
=
excit_alloc
(
EXCIT_SLICE
);
if
(
!
results
[
i
])
{
excit_free
(
tmp2
);
goto
error2
;
}
err
=
excit_slice_init
(
results
[
i
],
tmp
,
tmp2
);
if
(
err
)
{
excit_free
(
tmp2
);
goto
error2
;
}
}
excit_free
(
range
);
return
EXCIT_SUCCESS
;
error2:
for
(;
i
>=
0
;
i
--
)
excit_free
(
results
[
i
]);
error1:
excit_free
(
range
);
return
err
;
}
static
int
cons_it_nth
(
const
excit_t
data
,
ssize_t
n
,
ssize_t
*
indexes
)
{
ssize_t
size
;
int
err
=
cons_it_size
(
data
,
&
size
);
if
(
err
)
return
err
;
if
(
n
<
0
||
n
>=
size
)
return
-
EXCIT_EDOM
;
const
struct
cons_it_s
*
it
=
(
const
struct
cons_it_s
*
)
data
->
data
;
int
dim
=
it
->
it
->
dimension
;
if
(
indexes
)
{
for
(
int
i
=
0
;
i
<
it
->
n
;
i
++
)
{
err
=
excit_nth
(
it
->
it
,
n
+
i
,
indexes
+
dim
*
i
);
if
(
err
)
return
err
;
}
}
return
EXCIT_SUCCESS
;
}
static
int
cons_it_rank
(
const
excit_t
data
,
const
ssize_t
*
indexes
,
ssize_t
*
n
)
{
const
struct
cons_it_s
*
it
=
(
const
struct
cons_it_s
*
)
data
->
data
;
ssize_t
inner_n
,
inner_n_tmp
;
int
err
=
excit_rank
(
it
->
it
,
indexes
,
&
inner_n
);
if
(
err
)
return
err
;
int
dim
=
it
->
it
->
dimension
;
for
(
int
i
=
1
;
i
<
it
->
n
;
i
++
)
{
err
=
excit_rank
(
it
->
it
,
indexes
+
dim
*
i
,
&
inner_n_tmp
);
if
(
err
)
return
err
;
if
(
inner_n_tmp
!=
inner_n
+
1
)
return
-
EXCIT_EINVAL
;
inner_n
=
inner_n_tmp
;
}
if
(
n
)
*
n
=
inner_n
-
(
it
->
n
-
1
);
return
EXCIT_SUCCESS
;
}
static
int
cons_it_pos
(
const
excit_t
data
,
ssize_t
*
n
)
{
ssize_t
inner_n
;
const
struct
cons_it_s
*
it
=
(
const
struct
cons_it_s
*
)
data
->
data
;
int
err
=
excit_pos
(
it
->
it
,
&
inner_n
);
if
(
err
)
return
err
;
if
(
n
)
*
n
=
inner_n
-
(
it
->
n
-
1
);
return
EXCIT_SUCCESS
;
}
static
int
cons_it_peek
(
const
excit_t
data
,
ssize_t
*
indexes
)
{
const
struct
cons_it_s
*
it
=
(
const
struct
cons_it_s
*
)
data
->
data
;
int
err
;
int
dim
=
it
->
it
->
dimension
;
int
n
=
it
->
n
;
if
(
indexes
)
{
circular_fifo_dump
(
&
it
->
fifo
,
indexes
);
err
=
excit_peek
(
it
->
it
,
indexes
+
dim
*
(
n
-
1
));
}
else
err
=
excit_peek
(
it
->
it
,
NULL
);
if
(
err
)
return
err
;
return
EXCIT_SUCCESS
;
}
static
int
cons_it_next
(
excit_t
data
,
ssize_t
*
indexes
)
{
struct
cons_it_s
*
it
=
(
struct
cons_it_s
*
)
data
->
data
;
int
err
;
int
dim
=
it
->
it
->
dimension
;
int
n
=
it
->
n
;
if
(
indexes
)
{
circular_fifo_dump
(
&
it
->
fifo
,
indexes
);
err
=
excit_next
(
it
->
it
,
indexes
+
dim
*
(
n
-
1
));
}
else
err
=
excit_next
(
it
->
it
,
NULL
);
if
(
err
)
return
err
;
if
(
indexes
)
for
(
int
i
=
dim
*
(
n
-
1
);
i
<
dim
*
n
;
i
++
)
circular_fifo_add
(
&
it
->
fifo
,
indexes
[
i
]);
return
EXCIT_SUCCESS
;
}
static
int
cons_it_rewind
(
excit_t
data
)
{
struct
cons_it_s
*
it
=
(
struct
cons_it_s
*
)
data
->
data
;
int
err
=
excit_rewind
(
it
->
it
);
if
(
err
)
return
err
;
it
->
fifo
.
start
=
0
;
it
->
fifo
.
end
=
-
1
;
it
->
fifo
.
size
=
0
;
for
(
int
i
=
0
;
i
<
it
->
n
-
1
;
i
++
)
{
int
err
;
err
=
excit_next
(
it
->
it
,
it
->
fifo
.
buffer
+
it
->
it
->
dimension
*
i
);
if
(
err
)
return
err
;
it
->
fifo
.
size
+=
it
->
it
->
dimension
;
it
->
fifo
.
end
+=
it
->
it
->
dimension
;
}
return
EXCIT_SUCCESS
;
}
int
excit_cons_init
(
excit_t
it
,
excit_t
src
,
ssize_t
n
)
{
ssize_t
src_size
;
int
err
;
if
(
!
it
||
it
->
type
!=
EXCIT_CONS
||
!
src
||
n
<=
0
)
return
-
EXCIT_EINVAL
;
err
=
excit_size
(
src
,
&
src_size
);
if
(
err
)
return
err
;
if
(
src_size
<
n
)
return
-
EXCIT_EINVAL
;
struct
cons_it_s
*
cons_it
=
(
struct
cons_it_s
*
)
it
->
data
;
free
(
cons_it
->
fifo
.
buffer
);
excit_free
(
cons_it
->
it
);
it
->
dimension
=
n
*
src
->
dimension
;
cons_it
->
it
=
src
;
cons_it
->
n
=
n
;
cons_it
->
fifo
.
length
=
src
->
dimension
*
(
n
-
1
);
cons_it
->
fifo
.
buffer
=
(
ssize_t
*
)
malloc
(
cons_it
->
fifo
.
length
*
sizeof
(
ssize_t
));
if
(
!
cons_it
->
fifo
.
buffer
)
return
-
EXCIT_ENOMEM
;
err
=
cons_it_rewind
(
it
);
if
(
err
)
{
free
(
cons_it
->
fifo
.
buffer
);
return
err
;
}
return
EXCIT_SUCCESS
;
}
struct
excit_func_table_s
excit_cons_func_table
=
{
cons_it_alloc
,
cons_it_free
,
cons_it_copy
,
cons_it_next
,
cons_it_peek
,
cons_it_size
,
cons_it_rewind
,
cons_it_split
,
cons_it_nth
,
cons_it_rank
,
cons_it_pos
};
src/cons.h
0 → 100644
View file @
60103e54
#ifndef EXCIT_CONS_H
#define EXCIT_CONS_H
#include "excit.h"
#include "dev/excit.h"
struct
circular_fifo_s
{
ssize_t
length
;
ssize_t
start
;
ssize_t
end
;
ssize_t
size
;
ssize_t
*
buffer
;
};
struct
cons_it_s
{
excit_t
it
;
ssize_t
n
;
struct
circular_fifo_s
fifo
;
};
extern
struct
excit_func_table_s
excit_cons_func_table
;
#endif //EXCIT_CONS_H
src/dev/excit.h
0 → 100644
View file @
60103e54
#ifndef EXCIT_DEV_H
#define EXCIT_DEV_H
#include "../excit.h"
struct
excit_s
{
struct
excit_func_table_s
*
func_table
;
ssize_t
dimension
;
enum
excit_type_e
type
;
void
*
data
;
};
#endif
src/excit.c
View file @
60103e54
This diff is collapsed.
Click to expand it.
src/excit.h
View file @
60103e54
#ifndef EXCIT_H
#define EXCIT_H 1
#include <stdlib.h>
/*
* The different types of iterator supported. All iterators use the same
* integer type (ssize_t) for values.
*/
enum
excit_type_e
{
EXCIT_INVALID
,
/*!< Tag for invalid iterators */
EXCIT_RANGE
,
/*!< Iterator over a range of values */
EXCIT_CONS
,
/*!< Sliding window iterator */
EXCIT_REPEAT
,
/*!< Ierator that stutters a certain amount of times */
EXCIT_HILBERT2D
,
/*!< Hilbert space filing curve */
EXCIT_PRODUCT
,
/*!< Iterator over the catesian product of iterators */
EXCIT_SLICE
,
/*!< Iterator using another iterator to index a third */
EXCIT_USER
,
/*!< User-defined iterator */
EXCIT_TYPE_MAX
/*!< Guard */
EXCIT_INVALID
,
/*!< Tag for invalid iterators */
EXCIT_RANGE
,
/*!< Iterator over a range of values */
EXCIT_CONS
,
/*!< Sliding window iterator */
EXCIT_REPEAT
,
/*!< Ierator that stutters a certain amount of times */
EXCIT_HILBERT2D
,
/*!< Hilbert space filing curve */
EXCIT_PRODUCT
,
/*!< Iterator over the catesian product of iterators */
EXCIT_SLICE
,
/*!< Iterator using another iterator to index a third */
EXCIT_USER
,
/*!< User-defined iterator */
EXCIT_TYPE_MAX
/*!< Guard */
};
/*
* Returns the string representation of an iterator type.
*/
const
char
*
excit_type_name
(
enum
excit_type_e
type
);
const
char
*
excit_type_name
(
enum
excit_type_e
type
);
/*
* The different possible return codes of an excit function.
*/
enum
excit_error_e
{
EXCIT_SUCCESS
,
/*!< Sucess */
EXCIT_STOPIT
,
/*!< Iteration space is depleted */
EXCIT_ENOMEM
,
/*!< Out of memory */
EXCIT_EINVAL
,
/*!< Parameter has an invalid value */
EXCIT_EDOM
,
/*!< Parameter is out of possible domain */
EXCIT_ENOTSUP
,
/*!< Operation is not supported */
EXCIT_ERROR_MAX
/*!< Guard */
EXCIT_SUCCESS
,
/*!< Sucess */
EXCIT_STOPIT
,
/*!< Iteration space is depleted */
EXCIT_ENOMEM
,
/*!< Out of memory */
EXCIT_EINVAL
,
/*!< Parameter has an invalid value */
EXCIT_EDOM
,
/*!< Parameter is out of possible domain */
EXCIT_ENOTSUP
,
/*!< Operation is not supported */
EXCIT_ERROR_MAX
/*!< Guard */
};
/*
* Returns the string representation of a return code.
*/
const
char
*
excit_error_name
(
enum
excit_error_e
err
);
const
char
*
excit_error_name
(
enum
excit_error_e
err
);
/*
* Opaque structure of an iterator
...
...
@@ -77,66 +79,66 @@ struct excit_func_table_s {
* allocation, the inner data pointer will already be set.
* Returns EXCIT_SUCCESS or an error code.
*/
int
(
*
alloc
)(
excit_t
it
);
int
(
*
alloc
)
(
excit_t
it
);
/*
* This function is called during excit_free. After this function is
* called the iterator and the data will be freed.
*/
void
(
*
free
)(
excit_t
it
);
void
(
*
free
)
(
excit_t
it
);
/*
* This funciton is called during excit_dup. It is responsible for
* duplicating the content of the inner data between src_it and dst_it.
* Returns EXCIT_SUCCESS or an error code.
*/
int
(
*
copy
)(
excit_t
dst_it
,
const
excit_t
src_it
);
int
(
*
copy
)
(
excit_t
dst_it
,
const
excit_t
src_it
);
/*
* This function is responsible for implementing the next functionality
* of the iterator.
* Returns EXCIT_SUCCESS, EXCIT_STOPIT or an error code.
*/
int
(
*
next
)(
excit_t
it
,
ssize_t
*
indexes
);
int
(
*
next
)
(
excit_t
it
,
ssize_t
*
indexes
);
/*
* This function is responsible for implementing the peek functionality
* of the iterator.
* Returns EXCIT_SUCCESS, EXCIT_STOPIT or an error code.
*/
int
(
*
peek
)(
const
excit_t
it
,
ssize_t
*
indexes
);
int
(
*
peek
)
(
const
excit_t
it
,
ssize_t
*
indexes
);
/*
* This function is responsible for implementing the size functionality
* of the iterator.
* Returns EXCIT_SUCCESS or an error code.
*/
int
(
*
size
)(
const
excit_t
it
,
ssize_t
*
size
);
int
(
*
size
)
(
const
excit_t
it
,
ssize_t
*
size
);
/*
* This function is responsible for implementing the rewind
* functionality of the iterator.
* Returns EXCIT_SUCCESS or an error code.
*/
int
(
*
rewind
)(
excit_t
it
);
int
(
*
rewind
)
(
excit_t
it
);
/*
* This function is responsible for implementing the split
* functionality of the iterator.
* Returns EXCIT_SUCCESS or an error code.
*/
int
(
*
split
)(
const
excit_t
it
,
ssize_t
n
,
excit_t
*
results
);
int
(
*
split
)
(
const
excit_t
it
,
ssize_t
n
,
excit_t
*
results
);
/*
* This function is responsible for implementing the nth functionality
* of the iterator.
* Returns EXCIT_SUCCESS or an error code.
*/
int
(
*
nth
)(
const
excit_t
it
,
ssize_t
n
,
ssize_t
*
indexes
);
int
(
*
nth
)
(
const
excit_t
it
,
ssize_t
n
,
ssize_t
*
indexes
);
/*
* This function is responsible for implementing the rank functionality
* of the iterator.
* Returns EXCIT_SUCCESS or an error code.
*/
int
(
*
rank
)(
const
excit_t
it
,
const
ssize_t
*
indexes
,
ssize_t
*
n
);
int
(
*
rank
)
(
const
excit_t
it
,
const
ssize_t
*
indexes
,
ssize_t
*
n
);
/*
* This function is responsible for implementing the pos functionality
* of the iterator.
* Returns EXCIT_SUCCESS, EXCIT_STOPIT or an error code.
*/
int
(
*
pos
)(
const
excit_t
it
,
ssize_t
*
n
);
int
(
*
pos
)
(
const
excit_t
it
,
ssize_t
*
n
);
};
/*
...
...
@@ -203,7 +205,7 @@ int excit_type(excit_t it, enum excit_type_e *type);
* "dimension": a pointer where the result will be written.
* Returns EXCIT_SUCCESS or an error code.
*/
int
excit_dimension
(
excit_t
it
,
ssize_t
*
dimension
);
int
excit_dimension
(
excit_t
it
,
ssize_t
*
dimension
);
/*
* Gets the current element of an iterator and increments it.
...
...
@@ -213,7 +215,7 @@ int excit_dimension(excit_t it, ssize_t *dimension);
* Returns EXCIT_SUCCESS if a valid element was retured or EXCIT_STOPIT if the
* iterator is depleted or an error code.
*/
int
excit_next
(
excit_t
it
,
ssize_t
*
indexes
);
int
excit_next
(
excit_t
it
,
ssize_t
*
indexes
);
/*
* Gets the current element of an iterator.
...
...
@@ -223,7 +225,7 @@ int excit_next(excit_t it, ssize_t *indexes);
* Returns EXCIT_SUCCESS if a valid element was retured or EXCIT_STOPIT if the
* iterator is depleted or an error code.
*/
int
excit_peek
(
const
excit_t
it
,
ssize_t
*
indexes
);
int
excit_peek
(
const
excit_t
it
,
ssize_t
*
indexes
);
/*
* Rewinds an iterator to its initial state.
...
...
@@ -238,7 +240,7 @@ int excit_rewind(excit_t it);
* "size": an pointer to the variable where the result will be stored.
* Returns EXCIT_SUCCESS or an error code.
*/
int
excit_size
(
const
excit_t
it
,
ssize_t
*
size
);
int
excit_size
(
const
excit_t
it
,
ssize_t
*
size
);
/*
* Splits an iterator envenly into several suub iterators.
...
...
@@ -249,7 +251,7 @@ int excit_size(const excit_t it, ssize_t *size);
* Returns EXCIT_SUCCESS, -EXCIT_EDOM if the source iterator is too small to be
* subdivised in the wanted number or an error code.
*/
int
excit_split
(
const
excit_t
it
,
ssize_t
n
,
excit_t
*
results
);
int
excit_split
(
const
excit_t
it
,
ssize_t
n
,
excit_t
*
results
);
/*
* Gets the nth element of an iterator.
...
...
@@ -259,7 +261,7 @@ int excit_split(const excit_t it, ssize_t n, excit_t *results);
* iterator, no results is returned if NULL.
* Returns EXCIT_SUCCESS or an error code.
*/
int
excit_nth
(
const
excit_t
it
,
ssize_t
rank
,
ssize_t
*
indexes
);
int
excit_nth
(
const
excit_t
it
,
ssize_t
rank
,
ssize_t
*
indexes
);
/*
* Gets the rank of an element of an iterator.
...
...
@@ -269,7 +271,7 @@ int excit_nth(const excit_t it, ssize_t rank, ssize_t *indexes);
* returned if NULL.
* Returns EXCIT_SUCCESS or an error code.
*/
int
excit_rank
(
const
excit_t
it
,
const
ssize_t
*
indexes
,
ssize_t
*
rank
);
int
excit_rank
(
const
excit_t
it
,
const
ssize_t
*
indexes
,
ssize_t
*
rank
);
/*
* Gets the position of the iterator.
...
...
@@ -279,7 +281,7 @@ int excit_rank(const excit_t it, const ssize_t *indexes, ssize_t *rank);
* Returns EXCIT_SUCCESS or EXCIT_STOPIT if the iterator is depleted or an error
* code.
*/
int
excit_pos
(
const
excit_t
it
,
ssize_t
*
rank
);
int
excit_pos
(
const
excit_t
it
,
ssize_t
*
rank
);
/*
* Increments the iterator.
...
...
@@ -297,7 +299,7 @@ int excit_skip(excit_t it);
* iterator, no results is returned if NULL.
* Returns EXCIT_SUCCESS or an error code.
*/
int
excit_cyclic_next
(
excit_t
it
,
ssize_t
*
indexes
,
int
*
looped
);
int
excit_cyclic_next
(
excit_t
it
,
ssize_t
*
indexes
,
int
*
looped
);
/*
* Initializes a range iterator to iterate from first to last (included) by sep.
...
...
@@ -359,7 +361,7 @@ int excit_product_add_copy(excit_t it, excit_t added_it);
* "count": a pointer to a variable where the result will be stored.
* Returns EXCIT_SUCCESS or an error code.
*/
int
excit_product_count
(
const
excit_t
it
,
ssize_t
*
count
);
int
excit_product_count
(
const
excit_t
it
,
ssize_t
*
count
);
/*
* Splits a product iterator along the nth iterator.
...
...
@@ -373,7 +375,7 @@ int excit_product_count(const excit_t it, ssize_t *count);
* be subdivised in the wanted number or an error code.
*/
int
excit_product_split_dim
(
const
excit_t
it
,
ssize_t
dim
,
ssize_t
n
,
excit_t
*
results
);
excit_t
*
results
);
/*
* Initializes a slice iterator by giving asrc iterator and an indexer iterator.
...
...
src/hilbert2d.c
0 → 100644
View file @
60103e54
#include "dev/excit.h"
#include "hilbert2d.h"
static
void
rot
(
ssize_t
n
,
ssize_t
*
x
,
ssize_t
*
y
,
ssize_t
rx
,
ssize_t
ry
)
{
if
(
ry
==
0
)
{
if
(
rx
==
1
)
{
*
x
=
n
-
1
-
*
x
;
*
y
=
n
-
1
-
*
y
;
}
//Swap x and y
ssize_t
t
=
*
x
;
*
x
=
*
y
;
*
y
=
t
;
}
}
//convert (x,y) to d
static
ssize_t
xy2d
(
ssize_t
n
,
ssize_t
x
,
ssize_t
y
)
{
ssize_t
rx
,
ry
,
s
,
d
=
0
;
for
(
s
=
n
/
2
;
s
>
0
;
s
/=
2
)
{
rx
=
(
x
&
s
)
>
0
;
ry
=
(
y
&
s
)
>
0
;
d
+=
s
*
s
*
((
3
*
rx
)
^
ry
);
rot
(
s
,
&
x
,
&
y
,
rx
,
ry
);
}
return
d
;
}
//convert d to (x,y)
static
void
d2xy
(
ssize_t
n
,
ssize_t
d
,
ssize_t
*
x
,
ssize_t
*
y
)
{
ssize_t
rx
,
ry
,
s
,
t
=
d
;
*
x
=
*
y
=
0
;
for