Many data consumers are not interested in all of the item types that could be put in a ring buffer. This section describes the infrastructure for selecting subsets of the data from ring buffers that are formatted as described in this chapter.
The ring buffer low level access library provides
two powerful mechanisms for manipulating ring buffers based
the concept of predicates.
A predicate is a function that implement the
operator() method in a way that it returns
Predicate objects can therefore be thought of as functions that can
have state that persists between calls.
CRingBuffer has two member functions
blockWhile which periodically
invokes a predicate until it returns false
blocking for a settable time period between calls, and for a
While which simply repeatedly calls
a predicate until it returns false.
blockWhile but without blocking
between calls to the predicate.
Armed with predicates, these two member functions an an understanding that items in the ring will have the item format described in the previous section, it is possible to implement a scheme for selectively obtaining data from a ring buffer.
The base class for this selectivity is
CRingSelectionPredicate.h. It provides
base classes with the capability of specifying a list of item types
called a selection map. Elements of this
map consist of an item type and a flag. The virtual function
selectThis is given an item type peeked from
the ring buffer and returns false if the item
is acceptable. Unacceptable items are skipped, and true is returned
While continues to loop.
selectThis returns true, the framework
insepcts the type's flag. If false, the predicate as a whole
returns true. I false, the predicate skips the item if it is not
the last one in the ring.
Two pre-packaged specific derivations of
CRingSelectionPredicate have been built.
CDesiredTypesPredicate, any type not in the
list is assumed to be undesirable and skipped. In
CAllButPredicate, the list of types define
exceptiosn to the rule that all items are desired without sampling.
Items in the list with the sample flag false, are assumed to be
undesirable and are skipped. items in the list with the sample flag
true, are assumed to be wanted but only in sample mode.