| Version 13 (modified by , 3 years ago) ( diff ) |
|---|
CIVL Libraries
In progress.
bundle
Header: bundle.cvh. Uses: op.
A bundle is a sequence of objects of the same type, wrapped into an atomic package.
A bundle is created using a function that specifies a region of memory.
One can create a bundle from an array of integers, and another bundle from an array of reals.
Both bundles have the same type, $bundle.
They can therefore be entered into an array of $bundle, for example.
Hence bundles are useful for mixing objects of different (even statically unknown) types into a single data structure.
Later, the contents of a bundle can be extracted with another function that specifies a region of memory into which to unpack the bundle;
if that memory does not have the right type to receive the contents of the bundle, a runtime error occurs.
Types
$bundle: the bundle type
Functions
$system int $bundle_size($bundle b)- Returns the size of the given bundle, i.e., the number of bytes consumed by all elements of the bundle. This is the product of the number of elements and the size of one element.
$system $bundle $bundle_pack(void *ptr, int size)- This function creates a bundle from the memory region specified by
ptrandsize(the total number of bytes to copy), copying the data into the new bundle. It returns the new bundle.
- This function creates a bundle from the memory region specified by
$system void $bundle_unpack($bundle b, void *ptr)- This function copies the data from the given bundle into the memory region starting at
ptr. The memory region extends for$bundle_size(b)bytes.
- This function copies the data from the given bundle into the memory region starting at
$atomic_f void $bundle_unpack_apply($bundle data, void *buf, $operation op, int count, void *result)- This function unpacks the bundle while applying the specified numeric operation. Parameter
opspecifies a binary operation. For each i in 0..count-1, the operation is applied to the i-th element ofbufand the i-th element of the bundle, and the result is stored in the i-th position ofresult. Parametercountis the number of elements in the bundle;bufandresultshould each point to a region of memory capable of holding at leastcountelements.
- This function unpacks the bundle while applying the specified numeric operation. Parameter
Example
#include <bundle.cvh>
int main() {
int n = 10;
int a[n], b[n], c[n];
for (int i=0; i<n; i++) a[i] = i;
$bundle bun = $bundle_pack(a, n*sizeof(int));
$assert($bundle_size(bun) == n*sizeof(int));
$bundle_unpack(bun, b);
$assert($forall (int i: 0..n-1) b[i]==a[i]);
$bundle_unpack_apply(bun, b, _SUM, n, c);
$assert($forall (int i: 0..n-1) c[i]==2*a[i]);
}
comm
concurrency
domain
mem
op
Defines an enumerated type $operation with the following values:
| Constant | Description |
|---|---|
_NO_OP | no operation |
_MAX | maximum |
_MIN | minimun |
_SUM | sum |
_PROD | product |
_LAND | logical and |
_BAND | bit-wise and |
_LOR | logical or |
_BOR | bit-wise or |
_LXOR | logical exclusive or |
_BXOR | bit-wise exclusive or |
_MINLOC | min value and location |
_MAXLOC | max value and location |
_EQ | equal to |
_NEQ | not Equal to |
