1 // This is mul/vpdfl/vpdfl_builder_base.cxx
2 //:
3 // \file
4 // \author Tim Cootes
5 // \date 12-Apr-2001
6 // \brief Base for classes to build vpdfl_pdf_base objects.
7
8 #include "vpdfl_builder_base.h"
9
10 #include "vsl/vsl_indent.h"
11 #include "vsl/vsl_binary_loader.h"
12
13 #include <vpdfl/vpdfl_axis_gaussian_builder.h>
14 #include <vpdfl/vpdfl_gaussian_kernel_pdf_builder.h>
15 #include <vpdfl/vpdfl_gaussian_builder.h>
16
17 #include <mbl/mbl_read_props.h>
18 #include <mbl/mbl_cloneables_factory.h>
19 #include <mbl/mbl_parse_block.h>
20 #include <mbl/mbl_exception.h>
21
22 //=======================================================================
23
version_no() const24 short vpdfl_builder_base::version_no() const
25 {
26 return 1;
27 }
28
29 //=======================================================================
30
vsl_add_to_binary_loader(const vpdfl_builder_base & b)31 void vsl_add_to_binary_loader(const vpdfl_builder_base& b)
32 {
33 vsl_binary_loader<vpdfl_builder_base>::instance().add(b);
34 }
35
36 //=======================================================================
37
is_a() const38 std::string vpdfl_builder_base::is_a() const
39 {
40 return std::string("vpdfl_builder_base");
41 }
42
43 //=======================================================================
44
is_class(std::string const & s) const45 bool vpdfl_builder_base::is_class(std::string const& s) const
46 {
47 return s==vpdfl_builder_base::is_a();
48 }
49
50 //: Create a vpdfl_builder_base object given a config stream
51 // \throw vcl_runtime_exception if parse error.
new_builder_from_stream(std::istream & is)52 std::unique_ptr<vpdfl_builder_base> vpdfl_builder_base::new_builder_from_stream(std::istream &is)
53 {
54 // This function should really be replaced by a general loader scheme
55 // Ask Ian for examples from Manchester's private code base.
56
57 //: This will store the constructed builder.
58 std::unique_ptr<vpdfl_builder_base> builder;
59
60 std::string type;
61 is >> type;
62
63 if (type == "vpdfl_axis_gaussian_builder")
64 {
65 builder = std::unique_ptr<vpdfl_builder_base>(new vpdfl_axis_gaussian_builder());
66 }
67 else if (type == "vpdfl_gaussian_kernel_pdf_builder")
68 {
69 builder = std::unique_ptr<vpdfl_builder_base>(new vpdfl_gaussian_kernel_pdf_builder());
70 }
71 else if (type == "vpdfl_gaussian_builder")
72 {
73 builder = std::unique_ptr<vpdfl_builder_base>(new vpdfl_gaussian_builder());
74 }
75 else
76 mbl_exception_error(mbl_exception_no_name_in_factory(type,
77 "vpdfl_axis_gaussian_builder, vpdfl_gaussian_kernel_pdf_builder, vpdfl_gaussian_builder"));
78
79 //: Incoming properties
80 mbl_read_props_type props(mbl_read_props(is));
81 // which should be empty (until we add some relevant parameters)
82 mbl_read_props_look_for_unused_props("vpdfl_builder_base::new_builder_from_stream", props, mbl_read_props_type());
83 return builder;
84 }
85
86 //=======================================================================
87
vsl_b_write(vsl_b_ostream & bfs,const vpdfl_builder_base & b)88 void vsl_b_write(vsl_b_ostream& bfs, const vpdfl_builder_base& b)
89 {
90 b.b_write(bfs);
91 }
92
93 //=======================================================================
94
vsl_b_read(vsl_b_istream & bfs,vpdfl_builder_base & b)95 void vsl_b_read(vsl_b_istream& bfs, vpdfl_builder_base& b)
96 {
97 b.b_read(bfs);
98 }
99
100 //=======================================================================
101
vsl_print_summary(std::ostream & os,const vpdfl_builder_base & b)102 void vsl_print_summary(std::ostream& os,const vpdfl_builder_base& b)
103 {
104 os << b.is_a() << ": ";
105 vsl_indent_inc(os);
106 b.print_summary(os);
107 vsl_indent_dec(os);
108 }
109
110 //=======================================================================
111
vsl_print_summary(std::ostream & os,const vpdfl_builder_base * b)112 void vsl_print_summary(std::ostream& os,const vpdfl_builder_base* b)
113 {
114 if (b)
115 vsl_print_summary(os, *b);
116 else
117 os << "No vpdfl_builder_base defined.";
118 }
119
120 //=======================================================================
121
122 //: Stream output operator for class reference
operator <<(std::ostream & os,const vpdfl_builder_base & b)123 std::ostream& operator<<(std::ostream& os,const vpdfl_builder_base& b)
124 {
125 vsl_print_summary(os,b);
126 return os;
127 }
128
129 //=======================================================================
130
131 //: Stream output operator for class pointer
operator <<(std::ostream & os,const vpdfl_builder_base * b)132 std::ostream& operator<<(std::ostream& os,const vpdfl_builder_base* b)
133 {
134 vsl_print_summary(os,b);
135 return os;
136 }
137
138 //=======================================================================
139 //: Create a vpdfl_builder_base object given a config stream (recursive style)
140 // Creates object, then uses config_from_stream(is) to set up internals
141 std::unique_ptr<vpdfl_builder_base> vpdfl_builder_base::
new_pdf_builder_from_stream(std::istream & is)142 new_pdf_builder_from_stream(std::istream &is)
143 {
144 std::string name;
145 is >> name;
146 std::unique_ptr<vpdfl_builder_base> builder;
147 try
148 {
149 builder = mbl_cloneables_factory<vpdfl_builder_base>::get_clone(name);
150 }
151 catch (const mbl_exception_no_name_in_factory & e)
152 {
153 throw (mbl_exception_parse_error( e.what() ));
154 }
155 builder->config_from_stream(is);
156 return builder;
157 }
158
159 //=======================================================================
160 //: Read initialisation settings from a stream.
161 // The default implementation merely checks that no properties have
162 // been specified.
config_from_stream(std::istream & is)163 void vpdfl_builder_base::config_from_stream(
164 std::istream & is)
165 {
166 std::string s = mbl_parse_block(is);
167 if (s.empty() || s=="{}") return;
168
169 throw mbl_exception_parse_error(
170 this->is_a() + " expects no properties in initialisation,\n"
171 "But the following properties were given:\n" + s);
172 }
173