Rework how channels are selected for counting and listing.
Created a channel_predicate_object that encapsulates the set of restrictions which are placed on the count/list functions. This object defaults to all channels. New restrictions can be added by extending this object.
A NDS::channel_predicate function has been created which creates and initializes the channel_predicate_object. It takes an arbitrary number of restrictions in an arbitrary number. This allows the user to specify only the restrictions that are needed, and allows for extension of the type of predicates without impacting ordering. The only restriction is that each type of restriction must be a distinct type.
Added a NDS::frequency_range structure to represent min/max sample rates.
Viewing data/channel type as a list/container of NDS::channel::data/channel_type.
This is designed to accomodate adding predicates, such as timespans to the count/list functions, while keeping a simple interface.
For example this changes counting all 16-512Hz channels from:
conn.count_channels("*", NDS::channel::DEFAULT_CHANNEL_MASK, NDS::DEFAULT_DATA_MASK, 16.0, 512.0);
to
conn.count_channels(NDS::channel_predicate(NDS::frequency_range(16.0, 512.0)));
Where you only specify the part of the predicate you need. If more than one predicate is needed it can be provided in any order.