Registry.h
1//-*-C++-*-
2/***************************************************************************
3 *
4 * Copyright (C) 2004 - 2016 by Willem van Straten
5 * Licensed under the Academic Free License version 2.1
6 *
7 ***************************************************************************/
8
9// psrchive/Util/units/Registry.h
10
11#ifndef __Registry_h
12#define __Registry_h
13
14#include "ReferenceTo.h"
15
16#include <vector>
17#include <iostream>
18
19namespace Registry {
20
21 template<class Parent> class List;
22
24 template<class Parent>
25 class Entry : public Reference::Able
26 {
27 public:
28
29 friend class List<Parent>;
30
32 Parent* get () const { return instance; }
33
35 Entry () { instance = 0; }
36
38 virtual ~Entry () { if (instance) delete instance; }
39
40 protected:
41
43 void register_child (Parent* _instance)
44 {
46
48 std::cerr << "Registry::Entry<Parent>::register_child"
49 " instance=" << _instance << " registry=" << &registry <<
50 " size=" << registry.size() + 1 << std::endl;
51
52 instance = _instance;
53 registry.add (this);
54 }
55
57 virtual Parent* create () const = 0;
58
59 private:
60 Parent* instance;
61 };
62
64 template<class Parent>
65 class List : public Reference::Able
66 {
67
68 friend class Entry<Parent>;
69
70 public:
71
73 template<class Child> class Instances;
74
76 template<class Child> class Enter;
77
79 template<class Child, class Argument> class Unary;
80
82 unsigned size () const { return entries.size(); }
83
85 Parent* operator[] (unsigned i) const { return entries[i]->get(); }
86
88 void erase (unsigned i) { entries.erase( entries.begin() + i ); }
89
91 auto begin() const -> typename std::vector<Reference::To<Entry<Parent>>>::const_iterator { return entries.begin(); }
93 auto end() const -> typename std::vector<Reference::To<Entry<Parent>>>::const_iterator { return entries.end(); }
94
96 Parent* create (unsigned i) const { return entries[i]->create(); }
97
99 static bool verbose;
100
103 { if (!registry) { auto_delete = registry = new List; } return *registry; }
104
105 protected:
106
108 void add (Entry<Parent>* entry) { entries.push_back (entry); }
109
111 std::vector< Reference::To< Entry<Parent> > > entries;
112
114 static List* registry;
115
118 };
119
120 template<class Parent>
121 template<class Child>
122 class List<Parent>::Instances
123 {
124 public:
125 static unsigned get_instances () { return instances; }
126 static void add_instance () { instances++; }
127 private:
128 static unsigned instances;
129 };
130
132 template<class Parent>
133 template<class Child>
134 class List<Parent>::Enter : public Entry<Parent>
135 {
136 public:
139 {
141 this->register_child (new Child);
143 }
144
145 protected:
147 Parent* create () const { return new Child; }
148 };
149
151 template<class Parent>
152 template<class Child, class Argument>
153 class List<Parent>::Unary : public Entry<Parent>
154 {
155 public:
156
158 Unary (const Argument& arg)
159 {
160 argument = arg;
162 this->register_child( new Child(arg) );
164 }
165 protected:
167 Parent* create () const { return new Child(argument); }
169 Argument argument;
170 };
171
172
173}
174
175template<class Parent>
176template<class Child>
177unsigned Registry::List<Parent>::Instances<Child>::instances = 0;
178
179template<class Parent>
181
182template<class Parent>
184
185template<class Parent>
187
188#endif
Manages Reference::To references to the instance.
Definition ReferenceAble.h:35
Template class manages Reference::Able objects.
Definition ReferenceTo.h:25
Pure virtual template base class of Registry::List<Parent>::Enter<Child>
Definition Registry.h:26
void register_child(Parent *_instance)
Adds this instance to the Parent::Registry::List<Parent>
Definition Registry.h:43
virtual ~Entry()
Destructor deletes instance of Parent.
Definition Registry.h:38
virtual Parent * create() const =0
Return a pointer to a new instance of a Parent (or its children)
Parent * get() const
Return the pointer to the instance.
Definition Registry.h:32
Entry()
Null constructor.
Definition Registry.h:35
Enter a Child with default constructor into Registry::List<Parent>
Definition Registry.h:135
Enter()
Constructor registers only the first instance.
Definition Registry.h:138
Parent * create() const
Create a new instance of Child.
Definition Registry.h:147
Counts the number of instances of Child entries.
Definition Registry.h:123
Enter Child with unary constructor into Registry::List<Parent>
Definition Registry.h:154
Unary(const Argument &arg)
Constructor registers only the first instance.
Definition Registry.h:158
Argument argument
Argument to unary constructor.
Definition Registry.h:169
Parent * create() const
Create a new instance of Child.
Definition Registry.h:167
List of Registry::Entry.
Definition Registry.h:66
static bool verbose
verbosity flag used for debugging
Definition Registry.h:99
std::vector< Reference::To< Entry< Parent > > > entries
The vector of registry entries.
Definition Registry.h:111
auto begin() const -> typename std::vector< Reference::To< Entry< Parent > > >::const_iterator
Return the iterator that points to the first child.
Definition Registry.h:91
Parent * operator[](unsigned i) const
Return the specified entry.
Definition Registry.h:85
Parent * create(unsigned i) const
Return pointer to a null-constructed instance of Parent class.
Definition Registry.h:96
void add(Entry< Parent > *entry)
Add an entry to the registry.
Definition Registry.h:108
void erase(unsigned i)
Remove the specified entry.
Definition Registry.h:88
static List * registry
The single registry instance for the Parent class.
Definition Registry.h:114
unsigned size() const
Return the size of the list.
Definition Registry.h:82
static List & get_registry()
provide access to the single registry instance
Definition Registry.h:102
static Reference::To< List > auto_delete
Clean up the registry when the program exits.
Definition Registry.h:117
auto end() const -> typename std::vector< Reference::To< Entry< Parent > > >::const_iterator
Return the iterator that points to the end of the array after the last child.
Definition Registry.h:93
STL class.
Contains two basic classes that simplify dynamic memory management.
Definition HeapTracked.h:17
STL namespace.

Generated using doxygen 1.14.0