[Zodb-checkins] CVS: Zope/lib/python/BTrees - Maintainer.txt:1.2
Tim Peters
tim.one@comcast.net
Thu, 30 May 2002 23:22:59 -0400
Update of /cvs-repository/Zope/lib/python/BTrees
In directory cvs.zope.org:/tmp/cvs-serv6489
Modified Files:
Maintainer.txt
Log Message:
Fleshed out the existing text, reorganized, and added a blurb about the
new MULTI_INT_UNION.
=== Zope/lib/python/BTrees/Maintainer.txt 1.1 => 1.2 ===
extend BTrees.
+Macros
+======
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
-defined macros used to handle differences in key and value types:
+template. To create a new family of BTrees, create a source file that
+defines 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
- used to generate type names and the internal module name string.
+Configuration Macros
- DEFAULT_MAX_BUCKET_SIZE The maximum bucket size. Someday this will
- be tunable on BTree instances.
+MASTER_ID
+A string to hold an RCS/CVS Id key to be included in compiled binaries.
- DEFAULT_MAX_BTREE_SIZE The maximum btree size (number of
- children). Someday this will be tunable on BTree instances.
+MOD_NAME_PREFIX
+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",
- "PyObject *").
+DEFAULT_MAX_BUCKET_SIZE
+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
- converted to the (C) key type (KEY_TYPE). This macro should return a
- bollean. An exception will generally be raised if this returns false.
+DEFAULT_MAX_BTREE_SIZE
+An int giving the maximum size (number of children) of an internal
+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
- op.
+Macros for Keys
- INCREF_KEY(K) DECREFs the key of KEY_TYPE is PyObject* or is a no
- op.
-
- COPY_KEY(K, E) Copy a key's value from E to K. Note that this
- doesn't INCREF when KEY_TYPE is PyObject*.
+KEY_TYPE
+The C type declaration for keys (e.g., int or PyObject*).
- COPY_KEY_TO_OBJECT(O, K) Sets the PyObject* O to a PyObject*
- representation of K. Note that this is a new reference, so we INCREF
- when KEY_TYPE is PyObject*.
+KEY_CHECK(K)
+Tests whether the PyObject* K can be converted to the (C) key type
+(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
- without creating a new reference to ARG. If this can't be done, set
- a Python error and set status to 0. If there is no error, status is
- unchanged.
+TEST_KEY(K, T)
+Like Python's cmp(). Compares K(ey) to T(arget), where K & T are C
+data values of type KEY_TYPE). Return an int
+ < 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",
- "PyObject *").
+COPY_KEY(K, E)
+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
- data values (of type VALUE_TYPE). Returns -1 for K < T, 0 for K == T,
- or -1 if K > T.
+COPY_KEY_TO_OBJECT(O, K)
+Roughly like O=K. O is a PyObject*, and the macro must build a Python
+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
- op.
+COPY_KEY_FROM_ARG(TARGET, ARG, STATUS)
+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*
- representation of K. Note that this is a new reference, so we INCREF
- when VALUE_TYPE is PyObject*.
+Macros for Values
- COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) Copy an rgument to the target
- without creating a new reference to ARG. If this can't be done, set
- a Python error and set status to 0. If there is no error, status is
- unchanged.
+VALUE_TYPE
+The C type declaration for values (e.g., int or PyObject*).
- NORMALIZE_VALUE(V, MIN) Normalize the value, V, using the parameter
- MIN. This almost vertainly a YAGNI. It is a no op for most
- types. For integers, V is replaced by V/MIN only if MIN > 0.
+TEST_VALUE(K, T)
+Like TEST_KEY, except applied to values of VALUE_TYPE.
- MERGE_DEFAULT is a macro that should be set to the default value for
- sets when sets are are merged with mappings via weighed union or
- 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.
+DECREF_VALUE(K)
+Like DECREF_KEY, except applied to values of VALUE_TYPE.
- MERGE_WEIGHT(O, w) Computes a weighted value for O. This is used for
- "filling out" weighted unions.
+INCREF_VALUE(K)
+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