From: Ian S. <ian...@st...> - 2005-04-05 13:02:19
|
Riccardo Lattanzi wrote: > Hi, > > sorry for my last email...I should have slept over the problem. > Now everything is working fine (there were a lot of typos in the code!). > I build it and I was able to invert a matrix correctly. > Still I need your help for the integration with the multiprecision > library because I've never done anything similar to what you suggested. > That is: > > >>As far as I understand what you are doing, you should not need to add >>any code to vnl_matrix. The only thing you will need to do is add your >>own template instantiation file. >> >>// example tempalte instantion file for ARPREC. >>#include <vnl/vnl_complex.h> >>#include <vnl/vnl_matrix.txx> >>#include <arprec/mpcomplex.h> >>VNL_MATRIX_INSTANTIATE(mpcomplex); >> >>The instantiation will link against the operatots provided by ARPREC. >>You might have to add one for vnl_vector as well. >> > > > What do you mean by "adding my own instantion file for ARPREC" ? > I don't understand what "VNL_MATRIX_INSTANTIATE(mpcomplex);" does. > Is it a function? Template instantiation is the creation of code from a c++ template for a specific instace of the templates parameters, e.g. for vcl_pair<A,B>, you can implicitly instantiate vcl_pair<int,double> by using vcl_pair<int,double>, in which case all the necessary code is put into the current translation unit. (Well actually, it is all likely to be inlined away - but that is another issue.) Alternatively you can do explicit instantiation by declaring template <> vcl_pair<int, double>; which will include all the code associated vcl_pair, specialised for <int,double> into the current translation unit. Some compilers can do smart things, but we are restricted because our code has to work with a wide range of compilers, many of which do no smart stuff to help us handle template instantiation. So VXL uses implicit instantiation for all parts of the STL (or VCL as we call it.) However, our own templates in VXL are much larger than those in the STL, and having a copy in every translation unit that uses it would be very expensive in both compiled space, and compilation time. All of the code in VXL's *.txx files are explicitly instantiated once for each specialisation. This occurs in the template instantion files, which are kept in Template subdirs of the relevent library. The .txx file provides a macro, e.g. VNL_MATRIX_INSTANTIATE(A). For every template specialisation that we need e.g. vnl_matrix<double>, we have template instatiation file e.g. vnl/Templates/vnl_matrix+double-.cxx, that invokes the macro appropriately, e.g. #include <vnl/vnl_matrix.txx> VNL_MATRIX_INSTANTIATE(double); Some of the code in vnl_matrix is available in vnl_matrix.h in the hope that the compiler will inline it, but if you want to link against anything in vnl_matrix.txx you will need to provide a template instantiation file, like the example above. More details can be found in the VXL book at http://paine.wiau.man.ac.uk/pub/doc_vxl/books/core/book_3.html#SEC28 and http://paine.wiau.man.ac.uk/pub/doc_vxl/books/core/book_15.html#SEC152 Ian. |