You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
4.1 KiB
185 lines
4.1 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
/*
|
||
|
*
|
||
|
* Copyright (c) 1998-9
|
||
|
* Dr John Maddock
|
||
|
*
|
||
|
* Permission to use, copy, modify, distribute and sell this software
|
||
|
* and its documentation for any purpose is hereby granted without fee,
|
||
|
* provided that the above copyright notice appear in all copies and
|
||
|
* that both that copyright notice and this permission notice appear
|
||
|
* in supporting documentation. Dr John Maddock makes no representations
|
||
|
* about the suitability of this software for any purpose.
|
||
|
* It is provided "as is" without express or implied warranty.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* FILE re_lst.h
|
||
|
* VERSION 2.12
|
||
|
* This is an internal header file, do not include directly.
|
||
|
* re_list support class, for regular
|
||
|
* expression library.
|
||
|
*/
|
||
|
|
||
|
#ifndef RE_LST_H
|
||
|
#define RE_LST_H
|
||
|
|
||
|
#ifndef JM_CFG_H
|
||
|
#include <jm/jm_cfg.h>
|
||
|
#endif
|
||
|
|
||
|
#include <new.h>
|
||
|
|
||
|
JM_NAMESPACE(__JM)
|
||
|
|
||
|
template <class T, class Allocator>
|
||
|
class re_list
|
||
|
{
|
||
|
public:
|
||
|
struct node
|
||
|
{
|
||
|
node* next;
|
||
|
T t;
|
||
|
node(const T& o) : t(o) {}
|
||
|
};
|
||
|
public:
|
||
|
class iterator
|
||
|
{
|
||
|
node* pos;
|
||
|
public:
|
||
|
iterator() { pos = 0; }
|
||
|
~iterator() {}
|
||
|
iterator(const iterator& i) { pos = i.pos; }
|
||
|
iterator(node* n) { pos = n; }
|
||
|
iterator& operator=(const iterator& i)
|
||
|
{
|
||
|
pos = i.pos;
|
||
|
return *this;
|
||
|
}
|
||
|
bool operator==(iterator& i)
|
||
|
{
|
||
|
return pos == i.pos;
|
||
|
}
|
||
|
bool operator!=(iterator& i)
|
||
|
{
|
||
|
return pos != i.pos;
|
||
|
}
|
||
|
T& operator*() { return pos->t; }
|
||
|
iterator& operator++()
|
||
|
{
|
||
|
pos = pos->next;
|
||
|
return *this;
|
||
|
}
|
||
|
iterator operator++(int)
|
||
|
{
|
||
|
iterator t(*this);
|
||
|
pos = pos->next;
|
||
|
return t;
|
||
|
}
|
||
|
const node* tell()const
|
||
|
{
|
||
|
return pos;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
class const_iterator
|
||
|
{
|
||
|
const node* pos;
|
||
|
public:
|
||
|
const_iterator() { pos = 0; }
|
||
|
~const_iterator() {}
|
||
|
const_iterator(const const_iterator& i) { pos = i.pos; }
|
||
|
const_iterator(const iterator& i) { pos = i.tell(); }
|
||
|
const_iterator(const node* n) { pos = n; }
|
||
|
const_iterator& operator=(const iterator& i)
|
||
|
{
|
||
|
pos = i.tell();
|
||
|
return *this;
|
||
|
}
|
||
|
const_iterator& operator=(const const_iterator& i)
|
||
|
{
|
||
|
pos = i.pos;
|
||
|
return *this;
|
||
|
}
|
||
|
bool operator==(const_iterator& i)
|
||
|
{
|
||
|
return pos == i.pos;
|
||
|
}
|
||
|
bool operator!=(const_iterator& i)
|
||
|
{
|
||
|
return pos != i.pos;
|
||
|
}
|
||
|
const T& operator*() { return pos->t; }
|
||
|
const_iterator& operator++()
|
||
|
{
|
||
|
pos = pos->next;
|
||
|
return *this;
|
||
|
}
|
||
|
const_iterator operator++(int)
|
||
|
{
|
||
|
const_iterator t(*this);
|
||
|
pos = pos->next;
|
||
|
return t;
|
||
|
}
|
||
|
};
|
||
|
private:
|
||
|
typedef JM_MAYBE_TYPENAME REBIND_TYPE(node, Allocator) node_alloc;
|
||
|
|
||
|
struct data : public node_alloc
|
||
|
{
|
||
|
node* first;
|
||
|
data(const Allocator& a) : node_alloc(a), first(0) {}
|
||
|
};
|
||
|
data alloc_inst;
|
||
|
|
||
|
public:
|
||
|
re_list(const Allocator& a = Allocator()) : alloc_inst(a) {}
|
||
|
~re_list() { clear(); }
|
||
|
iterator RE_CALL begin() { return iterator(alloc_inst.first); }
|
||
|
iterator RE_CALL end() { return iterator(0); }
|
||
|
const_iterator RE_CALL begin()const { return const_iterator(alloc_inst.first); }
|
||
|
const_iterator RE_CALL end()const { return const_iterator(0); }
|
||
|
void RE_CALL add(const T& t)
|
||
|
{
|
||
|
node* temp;
|
||
|
temp = alloc_inst.allocate(1);
|
||
|
#ifndef JM_NO_EXCEPTIONS
|
||
|
try{
|
||
|
#endif
|
||
|
alloc_inst.construct(temp, t);
|
||
|
#ifndef JM_NO_EXCEPTIONS
|
||
|
}catch(...){ alloc_inst.deallocate(temp, 1); throw; }
|
||
|
#endif
|
||
|
temp->next = alloc_inst.first;
|
||
|
alloc_inst.first = temp;
|
||
|
}
|
||
|
void RE_CALL clear();
|
||
|
};
|
||
|
|
||
|
template <class T, class Allocator>
|
||
|
void RE_CALL re_list<T, Allocator>::clear()
|
||
|
{
|
||
|
node* temp;
|
||
|
while(alloc_inst.first)
|
||
|
{
|
||
|
temp = alloc_inst.first;
|
||
|
alloc_inst.first = alloc_inst.first->next;
|
||
|
alloc_inst.destroy(temp);
|
||
|
alloc_inst.deallocate(temp, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
JM_END_NAMESPACE
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|