Algorithm-RectanglesContainingDot_XS
view release on metacpan or search on metacpan
macro. Just C<#define> the macro before including C<ppport.h>:
#define DPPP_NAMESPACE MyOwnNamespace_
#include "ppport.h"
The default namespace is C<DPPP_>.
=back
The good thing is that most of the above can be checked by running
F<ppport.h> on your source code. See the next section for
details.
=head1 EXAMPLES
To verify whether F<ppport.h> is needed for your module, whether you
should make any changes to your code, and whether any special defines
should be used, F<ppport.h> can be run as a Perl script to check your
source code. Simply say:
perl ppport.h
* data from C. All statics in extensions should be reworked to use
* this, if you want to make the extension thread-safe. See ext/re/re.xs
* for an example of the use of these macros.
*
* Code that uses these macros is responsible for the following:
* 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
* 2. Declare a typedef named my_cxt_t that is a structure that contains
* all the data that needs to be interpreter-local.
* 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
* 4. Use the MY_CXT_INIT macro such that it is called exactly once
* (typically put in the BOOT: section).
* 5. Use the members of the my_cxt_t structure everywhere as
* MY_CXT.member.
* 6. Use the dMY_CXT macro (a declaration) in all the functions that
* access MY_CXT.
*/
#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT)
#ifndef START_MY_CXT
if ((runs = stackp->runs) == 0) {
iwhich = level & 1;
list1 = which[iwhich]; /* area where runs are now */
list2 = which[++iwhich]; /* area for merged runs */
do {
offset = stackp->offset;
f1 = p1 = list1 + offset; /* start of first run */
p = tp2 = list2 + offset; /* where merged run will go */
t = NEXT(p); /* where first run ends */
f2 = l1 = POTHER(t, list2, list1); /* ... on the other side */
t = NEXT(t); /* where second runs ends */
l2 = POTHER(t, list2, list1); /* ... on the other side */
offset = PNELEM(list2, t);
while (f1 < l1 && f2 < l2) {
/* If head 1 is larger than head 2, find ALL the elements
** in list 2 strictly less than head1, write them all,
** then head 1. Then compare the new heads, and repeat,
** until one or both lists are exhausted.
**
** In all comparisons (after establishing
** which head to merge) the item to merge
--stackp;
t = list1; list1 = list2; list2 = t; /* swap lists */
} while ((runs = stackp->runs) == 0);
}
stackp->runs = 0; /* current run will finish level */
/* While there are more than 2 runs remaining,
* turn them into exactly 2 runs (at the "other" level),
* each made up of approximately half the runs.
* Stack the second half for later processing,
* and set about producing the first half now.
*/
while (runs > 2) {
++level;
++stackp;
stackp->offset = offset;
runs -= stackp->runs = runs / 2;
}
/* We must construct a single run from 1 or 2 runs.
* All the original runs are in which[0] == base.
* The run we construct must end up in which[level&1].
*/
iwhich = level & 1;
if (runs == 1) {
/* Constructing a single run from a single run.
* If it's where it belongs already, there's nothing to do.
* Otherwise, copy it to where it belongs.
* A run of 1 is either a singleton at level 0,
* or the second half of a split 3. In neither event
* is it necessary to set offset. It will be set by the merge
* that immediately follows.
*/
if (iwhich) { /* Belongs in aux, currently in base */
f1 = b = PINDEX(base, offset); /* where list starts */
f2 = PINDEX(aux, offset); /* where list goes */
t = NEXT(f2); /* where list will end */
offset = PNELEM(aux, t); /* offset thereof */
t = PINDEX(base, offset); /* where it currently ends */
FROMTOUPTO(f1, f2, t); /* copy */
++level;
++stackp;
stackp->offset = offset;
stackp->runs = 0; /* take care of both runs, trigger merge */
if (!iwhich) { /* Merged runs belong in aux, copy 1st */
f1 = b = PINDEX(base, offset); /* where first run starts */
f2 = PINDEX(aux, offset); /* where it will be copied */
t = NEXT(f2); /* where first run will end */
offset = PNELEM(aux, t); /* offset thereof */
p = PINDEX(base, offset); /* end of first run */
t = NEXT(t); /* where second run will end */
t = PINDEX(base, PNELEM(aux, t)); /* where it now ends */
FROMTOUPTO(f1, f2, t); /* copy both runs */
NEXT(b) = p; /* paralled pointer for 1st */
NEXT(p) = t; /* ... and for second */
}
}
}
done:
if (aux != small) Safefree(aux); /* free iff allocated */
return;
}
( run in 1.684 second using v1.01-cache-2.11-cpan-39bf76dae61 )