#ifndef _HTMLTAGSTATESTORE_H
#define _HTMLTAGSTATESTORE_H
#include "HTMLParser.h"
#define STORESIZE 256
class HTMLTagStore {
bitset m_bits;
bool test(unsigned int b) const {return m_bits.test(b);}
//HTMLTagStore& changes(const HTMLTagStore &from, const HTMLTagStore &to) const;
public:
HTMLTagStore(): m_bits(0) {}
HTMLTagStore(HTMLTag *t): m_bits(0) {set(t);}
HTMLTagStore(vector *tags);
HTMLTagStore(vector *tags);
void set( HTMLTag* t) {m_bits.set( t->id()+1);}
void reset(HTMLTag* t) {m_bits.reset(t->id()+1);}
bool test( HTMLTag* t) const {return test( t->id()+1);}
HTMLTagStore& operator||(const HTMLTagStore &from) {}
void open( char *out);
void close(char *out);
class iterator;
iterator begin();
iterator end();
class iterator {
HTMLTagStore *m_ts;
unsigned int m_bit;
iterator(HTMLTagStore *_ts, unsigned int _bit): m_ts(_ts), m_bit(_bit) {}
friend iterator HTMLTagStore::begin();
friend iterator HTMLTagStore::end();
friend ostream& operator<<(ostream &out, HTMLTagStore::iterator i);
public:
void operator++() {if (m_bit < STORESIZE) do {m_bit++;} while (m_bit < STORESIZE && !m_ts->test(m_bit));}
void operator++(int) {if (m_bit < STORESIZE) do {m_bit++;} while (m_bit < STORESIZE && !m_ts->test(m_bit));}
void operator--() {if (m_bit) do {m_bit--;} while (m_bit && !m_ts->test(m_bit));}
void operator--(int) {if (m_bit) do {m_bit--;} while (m_bit && !m_ts->test(m_bit));}
bool operator==(iterator other) {return other.m_bit == m_bit;}
bool operator!=(iterator other) {return other.m_bit != m_bit;}
HTMLTag *operator*() {return HTMLTag::tag(m_bit-1);}
};
};
#endif