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