Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
ZEO
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
ZEO
Commits
58112635
Commit
58112635
authored
May 31, 2002
by
Tim Peters
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fleshed out the existing text, reorganized, and added a blurb about the
new MULTI_INT_UNION.
parent
73e5a696
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
107 additions
and
63 deletions
+107
-63
src/BTrees/Maintainer.txt
src/BTrees/Maintainer.txt
+107
-63
No files found.
src/BTrees/Maintainer.txt
View file @
58112635
This document provides information for developers who maintain or
This document provides information for developers who maintain or
extend BTrees.
extend BTrees.
Macros
======
BTrees are defined using a "template", roughly akin to a a C++
BTrees are defined using a "template", roughly akin to a a C++
template. To create a new family of BTrees, create a source file that
template.
To create a new family of BTrees, create a source file that
define
d
macros used to handle differences in key and value types:
define
s
macros used to handle differences in key and value types:
MASTER_ID provides a string to hold an RCS/CVS Id key to be included
in compiled binaries.
MOD_NAME_PREFIX provides the prefix used for the module. This gets
Configuration Macros
used to generate type names and the internal module name string.
DEFAULT_MAX_BUCKET_SIZE The maximum bucket size. Someday this will
MASTER_ID
be tunable on BTree instanc
es.
A string to hold an RCS/CVS Id key to be included in compiled binari
es.
DEFAULT_MAX_BTREE_SIZE The maximum btree size (number of
MOD_NAME_PREFIX
children). Someday this will be tunable on BTree instances.
A string (like "IO" or "OO") that provides the prefix used for the
module. This gets used to generate type names and the internal module
name string.
KEY_TYPE The C type declaration for the key data (e.g. "int",
DEFAULT_MAX_BUCKET_SIZE
"PyObject *").
An int giving the maximum bucket size (number of key/value pairs).
When a bucket gets larger than this due to an insertion *into a BTREE*,
it splits. Inserting into a bucket directly doesn't split, and
functions that produce a bucket output (e.g., union()) also have no
bound on how large a bucket may get. Someday this will be tunable
on BTree instances.
KEY_CHECK(K) Macro that tests whether a Python Object, K, can be
DEFAULT_MAX_BTREE_SIZE
converted to the (C) key type (KEY_TYPE). This macro should return a
An int giving the maximum size (number of children) of an internal
bollean. An exception will generally be raised if this returns false
.
btree node. Someday this will be tunable on BTree instances
.
TEST_KEY(K, T) Compares (ala Python cmp) K & T, where K & T are C
data values (of type KEY_TYPE). Returns -1 for K < T, 0 for K == T,
or -1 if K > T.
DECREF_KEY(K) DECREFs the key of KEY_TYPE is PyObject* or is a no
Macros for Keys
op.
INCREF_KEY(K) DECREFs the key of KEY_TYPE is PyObject* or is a no
KEY_TYPE
op.
The C type declaration for keys (e.g., int or PyObject*).
COPY_KEY(K, E) Copy a key's value from E to K. Note that this
doesn't INCREF when KEY_TYPE is PyObject*.
COPY_KEY_TO_OBJECT(O, K) Sets the PyObject* O to a PyObject*
KEY_CHECK(K)
representation of K. Note that this is a new reference, so we INCREF
Tests whether the PyObject* K can be converted to the (C) key type
when KEY_TYPE is PyObject*.
(KEY_TYPE). The macro should return a boolean (zero for false,
non-zero for true). When it returns false, its caller should probably
set a TypeError exception.
COPY_KEY_FROM_ARG(TARGET, ARG, STATUS) Copy an rgument to the target
TEST_KEY(K, T)
without creating a new reference to ARG. If this can't be done, set
Like Python's cmp(). Compares K(ey) to T(arget), where K & T are C
a Python error and set status to 0. If there is no error, status is
data values of type KEY_TYPE). Return an int
unchanged.
< 0 if K < T
== 0 if K == T
> 0 if K > T
DECREF_KEY(K)
K is a value of KEY_TYPE. If KEY_TYPE is a flavor of PyObject*, write
this to do Py_DECREF(K). Else (e.g., KEY_TYPE is int) make it a nop.
INCREF_KEY(K)
K is a value of KEY_TYPE. If KEY_TYPE is a flavor of PyObject*, write
this to do Py_INCREF(K). Else (e.g., KEY_TYPE is int) make it a nop.
VALUE_TYPE The C type declaration for the value data (e.g. "int",
COPY_KEY(K, E)
"PyObject *").
Like K=E. Copy a key from E to K, both of KEY_TYPE. Note that this
doesn't decref K or incref E when KEY_TYPE is a PyObject*; the caller
is responsible for keeping refcounts straight.
TEST_VALUE(K, T) Compares (ala Python cmp) K & T, where K & T are C
COPY_KEY_TO_OBJECT(O, K)
data values (of type VALUE_TYPE). Returns -1 for K < T, 0 for K == T,
Roughly like O=K. O is a PyObject*, and the macro must build a Python
or -1 if K > T.
object form of K, assign it to O, and ensure that O owns the reference
to its new value. It may do this by creating a new Python object based
on K (e.g., PyInt_FromLong(K) when KEY_TYPE is int), or simply by doing
Py_INCREF(K) if KEY_TYPE is a PyObject*.
DECREF_VALUE(K) DECREFs the value of VALUE_TYPE is PyObject* or is a no
COPY_KEY_FROM_ARG(TARGET, ARG, STATUS)
op.
Copy an argument to the target without creating a new reference to ARG.
ARG is a PyObject*, and TARGET is of type KEY_TYPE. If this can't be
done (for example, KEY_CHECK(ARG) returns false), set a Python error
and set status to 0. If there is no error, leave status alone.
INCREF_VALUE(K) DECREFs the value of VALUE_TYPE is PyObject* or is a no
op.
COPY_VALUE(K, E) Copy a value's value from E to K. Note that this
doesn't INCREF when VALUE_TYPE is PyObject*.
COPY_VALUE_TO_OBJECT(O, K) Sets the PyObject* O to a PyObject*
Macros for Values
representation of K. Note that this is a new reference, so we INCREF
when VALUE_TYPE is PyObject*.
COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) Copy an rgument to the target
VALUE_TYPE
without creating a new reference to ARG. If this can't be done, set
The C type declaration for values (e.g., int or PyObject*).
a Python error and set status to 0. If there is no error, status is
unchanged.
NORMALIZE_VALUE(V, MIN) Normalize the value, V, using the parameter
TEST_VALUE(K, T)
MIN. This almost vertainly a YAGNI. It is a no op for most
Like TEST_KEY, except applied to values of VALUE_TYPE.
types. For integers, V is replaced by V/MIN only if MIN > 0.
MERGE_DEFAULT is a macro that should be set to the default value for
DECREF_VALUE(K)
sets when sets are are merged with mappings via weighed union or
Like DECREF_KEY, except applied to values of VALUE_TYPE.
intersection.
MERGE(O1, w1, O2, w2) This macro performs a weighted merge of two
values, O1 and O2 using weights w1 and w2. Note that weighted unions
and intersections are not enabled if this macro is undefined.
MERGE_WEIGHT(O, w) Computes a weighted value for O. This is used for
INCREF_VALUE(K)
"filling out" weighted unions.
Like INCREF_KEY, except applied to values of VALUE_TYPE.
COPY_VALUE(K, E)
Like COPY_KEY, except applied to values of VALUE_TYPE.
COPY_VALUE_TO_OBJECT(O, K)
Like COPY_KEY_TO_OBJECT, except applied to values of VALUE_TYPE.
COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS)
Like COPY_KEY_FROM_ARG, except applied to values of VALUE_TYPE.
NORMALIZE_VALUE(V, MIN)
Normalize the value, V, using the parameter MIN. This is almost
certainly a YAGNI. It is a no op for most types. For integers, V is
replaced by V/MIN only if MIN > 0.
Macros for Set Operations
MERGE_DEFAULT
A value of VALUE_TYPE specifying the value to associate with set
elements when sets are merged with mappings via weighed union or
weighted intersection.
MERGE(O1, w1, O2, w2)
Performs a weighted merge of two values, O1 and O2, using weights w1
and w2. The result must be of VALUE_TYPE. Note that weighted unions
and weighted intersections are not enabled if this macro is left
undefined.
MERGE_WEIGHT(O, w)
Computes a weighted value for O. The result must be of VALUE_TYPE.
This is used for "filling out" weighted unions, i.e. to compute a
weighted value for keys that appear in only one of the input
mappings. If left undefined, MERGE_WEIGHT defaults to
#define MERGE_WEIGHT(O, w) (O)
MULTI_INT_UNION
The value doesn't matter. If defined, SetOpTemplate.c compiles
code for a multiunion() function (compute a union of many input sets
at high speed). This currently makes sense only for II sets, so
only _IIBTree.c defines it.
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment