Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.
 
 
 
 
 
 

184 lines
4.1 KiB

//========= 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