Zuerst sei darauf hingewiesen, wie eine Instanz von circuit_buffer angelegt werden kann:
circuit_buffer<mytype,mysize> cb;Als Templateparameter sind also der Elementetyp und die Kapazität des Puffers anzugeben. Die Kapazität meint die Anzahl der Elemente, die der Puffer verwalten kann. Sie ist vom compilerabhängigen Typ size_t und zumeist unsigned int.
Der Kopf der Templatedeklaration:
template <typename T, size_t cap> class circuit_buffer
Bisher sind nicht implementiert:
Typdefinitionen:
typedef std::vector<T> container_type; typedef size_t size_type; typedef T& reference; typedef const T& const_reference; typedef T value_type;Der im Folgenden verwendete Typ iterator ist der Typ des im Template circuit_buffer definierten Typs iterator, also iterator == circuit_butter<T,cap>::iterator.
Standardkonstruktor:
circuit_buffer();Dieser initialisiert die Zugriffsindizes (first, next, current) und reserviert den erforderlichen Speicher. (keine Ausnahmebehandlung)
Statusmethoden: (teilweise selbsterklärend)
bool empty(); bool full(); size_type size(); // liefert die aktuelle Anzahl an gültigen Elementen.
Methoden zur Erzeugung von Iteratoren:
iterator begin(); // liefert einen Iterator auf das erste Element iterator end(); // liefert einen Iterator hinter das letzte ElementWenn der Puffer leer ist, sind beide Iteratoren gleich.
Schreibmethoden und -Operatoren:
void add(value_type val) // fügt ein Element am Pufferende dazu circuit_buffer& operator<<(value_type val); // ruft add(val) aufDer Operator liefert eine Referenz auf den Puffer zurück, damit die verkettete Notation des Schreiboperators möglich wird (cb << x << y;). Beim Schreiben wird das bisher erste Element ungültig, wenn der Puffer bereits voll ist.
Methoden für den sukzessiven Lesezugriff ohne Iteratoren
void reset(); // setzt Zugriffsindex auf das älteste Element value_type get(); // liefert das Element an der Stelle des Zugriffsindex circuit_buffer& operator>>(reference ref); // ruft ref=get() aufget() setzt auch den Zugriffsindex auf das nächste Element. Wenn der Puffer leer ist, ist der gelieferte Wert undefiniert. Der Operator liefert eine Referenz auf den Puffer zurück, damit die verkettete Notation des Leseoperators möglich wird (cb >> x >> y;).
Die Headerdatei beinhaltet sowohl die Deklaration als auch die Implementationen (implizite inline-Makros).