00001
00002 #ifndef vsl_clipon_binary_loader_txx_
00003 #define vsl_clipon_binary_loader_txx_
00004
00005
00006
00007 #include "vsl_clipon_binary_loader.h"
00008 #include <vcl_cstdlib.h>
00009 #include <vcl_vector.txx>
00010
00011 template<class BaseClass, class BaseClassIO>
00012 vsl_clipon_binary_loader<BaseClass,BaseClassIO>& vsl_clipon_binary_loader<BaseClass,BaseClassIO>::instance()
00013 {
00014 if (instance_ == 0)
00015 {
00016 instance_ = new vsl_clipon_binary_loader<BaseClass,BaseClassIO>;
00017
00018
00019 instance_->register_this();
00020 }
00021 return *instance_;
00022 }
00023
00024
00025 template<class BaseClass, class BaseClassIO>
00026 void vsl_clipon_binary_loader<BaseClass,BaseClassIO>::add( const BaseClassIO& b)
00027 {
00028 object_io_.push_back(b.clone());
00029 }
00030
00031
00032 template<class BaseClass, class BaseClassIO>
00033 int vsl_clipon_binary_loader<BaseClass,BaseClassIO>::index_for_name(const vcl_string& name) const
00034 {
00035 unsigned int i=0;
00036 while ((i<object_io_.size()) && !(object_io_[i]->target_classname()==name))
00037 ++i;
00038
00039 if (i>=object_io_.size())
00040 {
00041 vcl_cerr << "vsl_clipon_binary_loader<BaseClass>::index_for_name: "
00042 << "class name <" << name << "> not in list of loaders\n"
00043 << object_io_.size()<<" valid loaders available for\n";
00044 for (unsigned int j=0; j<object_io_.size(); ++j)
00045 vcl_cerr << object_io_[j]->target_classname() << vcl_endl;
00046 vcl_abort();
00047 }
00048
00049 return i;
00050 }
00051
00052
00053 template<class BaseClass, class BaseClassIO>
00054 const BaseClassIO& vsl_clipon_binary_loader<BaseClass,BaseClassIO>::io_for_class(const BaseClass& b) const
00055 {
00056 unsigned int i;
00057 for (i=0; (i<object_io_.size()) && !(object_io_[i]->is_io_for(b)); i++);
00058
00059 if (i>=object_io_.size())
00060 {
00061 vcl_cerr << "vsl_clipon_binary_loader<BaseClass>::io_for_class: "
00062 << "Unable to determine suitable loader.\n"
00063 << object_io_.size()<<" valid loaders available for\n";
00064 for (unsigned int j=0; j<object_io_.size(); ++j)
00065 vcl_cerr << object_io_[j]->target_classname() << vcl_endl;
00066 vcl_abort();
00067 }
00068
00069 return *object_io_[i];
00070 }
00071
00072
00073 template<class BaseClass, class BaseClassIO>
00074 const BaseClassIO& vsl_clipon_binary_loader<BaseClass,BaseClassIO>::object_io(const vcl_string& name) const
00075 {
00076 return *object_io_[index_for_name(name)];
00077 }
00078
00079
00080 template<class BaseClass, class BaseClassIO>
00081 void vsl_clipon_binary_loader<BaseClass,BaseClassIO>::make_empty()
00082 {
00083 for (unsigned int i=0; i<object_io_.size(); ++i)
00084 delete object_io_[i];
00085 object_io_.resize(0);
00086 }
00087
00088 template<class BaseClass, class BaseClassIO>
00089 vsl_clipon_binary_loader<BaseClass,BaseClassIO>::~vsl_clipon_binary_loader()
00090 {
00091 make_empty();
00092 }
00093
00094
00095 template<class BaseClass, class BaseClassIO>
00096 void vsl_clipon_binary_loader<BaseClass,BaseClassIO>::read_object( vsl_b_istream& is, BaseClass*& b)
00097 {
00098
00099 delete b;
00100
00101 vcl_string name;
00102 vsl_b_read(is,name);
00103
00104 if (name=="VSL_NULL_PTR")
00105 {
00106
00107 b=0;
00108 return;
00109 }
00110
00111 const BaseClassIO& io = object_io(name);
00112 b = io.new_object();
00113 io.b_read_by_base(is,*b);
00114 }
00115
00116
00117 template<class BaseClass, class BaseClassIO>
00118 void vsl_clipon_binary_loader<BaseClass,BaseClassIO>::write_object( vsl_b_ostream& os, const BaseClass* b)
00119 {
00120 if (b==0)
00121 {
00122 vsl_b_write(os,vcl_string("VSL_NULL_PTR"));
00123 return;
00124 }
00125
00126 const BaseClassIO& io = io_for_class(*b);
00127 vsl_b_write(os,io.target_classname());
00128 io.b_write_by_base(os,*b);
00129 }
00130
00131
00132 template<class BaseClass, class BaseClassIO>
00133 void vsl_clipon_binary_loader<BaseClass,BaseClassIO>::print_object_summary( vcl_ostream& os, const BaseClass* b)
00134 {
00135 if (b==0)
00136 {
00137 os<<"No object defined.";
00138 return;
00139 }
00140
00141 const BaseClassIO& io = io_for_class(*b);
00142 io.print_summary_by_base(os,*b);
00143 }
00144
00145 template <class B, class IO>
00146 vsl_clipon_binary_loader<B, IO>* vsl_clipon_binary_loader<B, IO>::instance_ = 0;
00147
00148 #define VSL_CLIPON_BINARY_LOADER_INSTANTIATE(B,IO) \
00149 template class vsl_clipon_binary_loader<B, IO >; \
00150 VCL_VECTOR_INSTANTIATE(IO*)
00151
00152 #endif // vsl_clipon_binary_loader_txx_