interface_factory.h
1//-*-C++-*-
2/***************************************************************************
3 *
4 * Copyright (C) 2012 by Willem van Straten
5 * Licensed under the Academic Free License version 2.1
6 *
7 ***************************************************************************/
8
9// psrchive/Util/units/interface_factory.h
10
11#ifndef __interface_factory_h
12#define __interface_factory_h
13
14#include "separate.h"
15#include "stringtok.h"
16
17// #define _DEBUG 1
18#include "debug.h"
19
20namespace TextInterface
21{
37
38 template<typename T, typename C>
39 T* factory (C& ptrs, std::string name_parse)
40 {
41 std::string name = stringtok (name_parse, ":");
42
43 DEBUG("TextInterface::factory name=" << name);
44
45 if (name == "0")
46 return 0;
47
48 Reference::To<T> result;
49
50 std::string message;
51
52 if (name == "help")
53 message +=
54 "\n\n"
55 "Options:"
56 "\n\n";
57
58 for (auto ptr=ptrs.begin(); ptr != ptrs.end(); ptr++)
59 {
60 Reference::To<T> candidate = *ptr;
61 Reference::To<TextInterface::Parser> interface = candidate->get_interface();
62
63 if (name == "help")
64 {
65 message += interface->get_interface_name() + "\t"
66 + interface->get_interface_description() + "\n"
67 + interface->help (true, false, " ");
68 }
69 else if (interface->get_interface_name() == name)
70 {
71 result = candidate->clone ();
72 }
73
74 interface = 0;
75 candidate.release();
76
77 if (result)
78 break;
79 }
80
81 if (name == "help")
82 {
83 DEBUG("TextInterface::factory throwing HelpMessage = " << message);
84 throw Error (HelpMessage, std::string(), message);
85 }
86
87 if (!result)
88 throw Error (InvalidState, std::string(),
89 "no instance named '" + name + "'");
90
91 DEBUG("TextInterface::factory options=" << name_parse);
92
93 while (braced(name_parse))
94 {
95 DEBUG("TextInterface::factory removing brackets");
96 name_parse.erase (name_parse.begin());
97 name_parse.erase (name_parse.end()-1);
98 }
99
100 Reference::To<TextInterface::Parser> interface = result->get_interface();
101
102 std::vector<std::string> options;
103 standard_separation (options, name_parse);
104 for (unsigned i=0; i<options.size(); i++)
105 {
106 DEBUG("TextInterface::factory option["<<i<<"]=" << options[i]);
107
108 interface->process (options[i]);
109 }
110
111 interface = 0;
112 return result.release();
113 }
114
115}
116
117#endif
Type * release()
Return the pointer and unhook without deleting the object.
Definition ReferenceTo.h:263

Generated using doxygen 1.14.0