uint last_fill_index = 0;
std::set<uint> vUsedLabels;
+free_list<RegExp*> RegExp::vFreeList;
+free_list<Range*> Range::vFreeList;
+
using namespace std;
static char *opt_arg = NULL;
#define _re_h
#include <iostream>
+#include <set>
#include "token.h"
#include "ins.h"
#include "globals.h"
namespace re2c
{
+template<class _Ty>
+class free_list: protected std::set<_Ty>
+{
+public:
+ typedef typename std::set<_Ty>::iterator iterator;
+ typedef typename std::set<_Ty>::size_type size_type;
+ typedef typename std::set<_Ty>::key_type key_type;
+
+ free_list(): in_clear(false)
+ {
+ }
+
+ using std::set<_Ty>::insert;
+
+ size_type erase(const key_type& key)
+ {
+ if (!in_clear)
+ {
+ return std::set<_Ty>::erase(key);
+ }
+ return 0;
+ }
+
+ void clear()
+ {
+ in_clear = true;
+
+ for(iterator it = this->begin(); it != this->end(); ++it)
+ {
+ delete *it;
+ }
+ std::set<_Ty>::clear();
+
+ in_clear = false;
+ }
+
+ ~free_list()
+ {
+ clear();
+ }
+
+protected:
+ bool in_clear;
+};
+
typedef struct extop
{
char op;
Range *next;
uint lb, ub; // [lb,ub)
+ static free_list<Range*> vFreeList;
+
public:
Range(uint l, uint u) : next(NULL), lb(l), ub(u)
- { }
+ {
+ vFreeList.insert(this);
+ }
Range(Range &r) : next(NULL), lb(r.lb), ub(r.ub)
- { }
+ {
+ vFreeList.insert(this);
+ }
+
+ ~Range()
+ {
+ vFreeList.erase(this);
+ }
friend std::ostream& operator<<(std::ostream&, const Range&);
friend std::ostream& operator<<(std::ostream&, const Range*);
public:
uint size;
+
+ static free_list<RegExp*> vFreeList;
public:
RegExp() : size(0)
{
+ vFreeList.insert(this);
+ }
+
+ virtual ~RegExp()
+ {
+ vFreeList.erase(this);
}
- virtual ~RegExp() {}
virtual const char *typeOf() = 0;
RegExp *isA(const char *t)
{