Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
createUnique.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <climits>
9
10#include <ext/type_traits>
11#include <ext/algorithm>
12#include <ext/functional>
13
14#include <alib/set>
15
17
18namespace common {
19
20template < class T >
21inline void inc ( T & object ) {
22 ++ object;
23}
24
25template < >
26inline void inc ( std::string & object ) {
27 object.push_back ( '\'' );
28}
29
30template < >
31inline void inc ( ext::string & object ) {
32 object.push_back ( '\'' );
33}
34
45template < class T, class ... Alphabets >
46T createUnique ( T object, const Alphabets & ... alphabets ) {
47 unsigned i = 0;
48
49 do {
50 if ( ( ... && ( alphabets.count ( ext::poly_comp ( object ) ) == 0 ) ) )
51 return object;
52
53 inc ( object );
54 } while ( i++ < INT_MAX );
55
56 throw exception::CommonException ( "Could not create unique symbol." );
57}
58
59}
60
Basic exception from which all other exceptions are derived.
Definition: CommonException.h:21
Definition: string.hpp:41
int i
Definition: AllEpsilonClosure.h:118
Definition: Permutation.hpp:18
T createUnique(T object, const Alphabets &... alphabets)
Definition: createUnique.hpp:46
void inc(T &object)
Definition: createUnique.hpp:21
PolyComp< T > poly_comp(const T &inst)
Definition: functional.hpp:60
Definition: AnyObject.h:28