image3d.hh

00001 // Copyright (C) 2001, 2002, 2003, 2004  EPITA Research and Development Laboratory
00002 //
00003 // This file is part of the Olena Library.  This library is free
00004 // software; you can redistribute it and/or modify it under the terms
00005 // of the GNU General Public License version 2 as published by the
00006 // Free Software Foundation.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this library; see the file COPYING.  If not, write to
00015 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
00016 // MA 02111-1307, USA.
00017 //
00018 // As a special exception, you may use this file as part of a free
00019 // software library without restriction.  Specifically, if other files
00020 // instantiate templates or use macros or inline functions from this
00021 // file, or you compile this file and link it with other files to
00022 // produce an executable, this file does not by itself cause the
00023 // resulting executable to be covered by the GNU General Public
00024 // License.  This exception does not however invalidate any other
00025 // reasons why the executable file might be covered by the GNU General
00026 // Public License.
00027 
00028 #ifndef OLENA_CORE_IMAGE3D_HH
00029 # define OLENA_CORE_IMAGE3D_HH
00030 
00031 # include <oln/core/point3d.hh>
00032 # include <oln/core/dpoint3d.hh>
00033 # include <oln/core/fwd_iter3d.hh>
00034 # include <oln/core/bkd_iter3d.hh>
00035 # include <oln/core/impl/image_array3d.hh>
00036 # include <oln/io/readable.hh>
00037 # include <oln/core/image.hh>
00038 
00039 # include <iostream>
00040 # include <stdlib.h>
00041 
00042 namespace oln {
00043 
00044   template<class T, class Exact = mlc::final>
00045   class image3d; // fwd_decl
00046 
00053   template<class T, class Exact>
00054   struct image_id<image3d<T, Exact> >
00055   {
00056     enum{dim = 3};
00057     typedef T value_type;
00058     typedef typename mlc::exact_vt<image3d<T, Exact>, Exact>::ret exact_type;
00059     typedef impl::image_array3d<T> impl_type;
00060     typedef point3d point_type;
00061     typedef image3d_size size_type;
00062   };
00063 
00070   template<class T, class Exact>
00071   struct image_traits<image3d<T, Exact> >:
00072     public image_traits<image<image_id<image3d<T, Exact> >::dim,
00073                               typename image_id<image3d<T, Exact> >::value_type,
00074                               typename image_id<image3d<T, Exact> >::impl_type,
00075                               typename image_id<image3d<T, Exact> >::exact_type> >
00076   {};
00077 
00078   // client can use image3d; instances are real images, that is,
00079   // images with data ---conversely to proxy images
00080 
00088   template<class T, class Exact>
00089   class image3d:
00090     public image<image_id<image3d<T, Exact> >::dim,
00091                  typename image_id<image3d<T, Exact> >::value_type,
00092                  typename image_id<image3d<T, Exact> >::impl_type,
00093                  typename image_id<image3d<T, Exact> >::exact_type>
00094   {
00095 
00096   public:
00097 
00098     typedef image3d<T, Exact> self_type;
00099     typedef typename image_id<image3d<T, Exact> >::value_type value_type;
00100     typedef typename image_id<image3d<T, Exact> >::exact_type exact_type;
00101     typedef typename image_id<image3d<T, Exact> >::impl_type impl_type;
00102     typedef image<image_id<image3d<T, Exact> >::dim,
00103                   value_type,
00104                   impl_type,
00105                   exact_type> super_type;
00106 
00107     friend class abstract::image<exact_type>;
00108 
00109     image3d() :
00110       super_type()
00111     {
00112       mlc_init_static_hierarchy(Exact);
00113     }
00114 
00121     image3d(coord nslices, coord nrows, coord ncols, coord border = 2) :
00122       super_type(new impl_type(image3d_size(nslices, nrows, ncols, border)))
00123     {
00124       mlc_init_static_hierarchy(Exact);
00125     }
00126 
00131     image3d(const image3d_size& size) :
00132       super_type(new impl_type(size))
00133     {
00134       mlc_init_static_hierarchy(Exact);
00135     }
00136 
00146     image3d(self_type& rhs) :
00147       super_type(rhs)
00148     {
00149       mlc_init_static_hierarchy(Exact);
00150     }
00151 
00152     // io
00160     image3d(const io::internal::anything& r) : super_type()
00161     {
00162       mlc_init_static_hierarchy(Exact);
00163       r.assign(*this);
00164     }
00165 
00173     image3d&
00174     operator=(const io::internal::anything& r)
00175     {
00176       return r.assign(*this);
00177     }
00178 
00186     exact_type&
00187     operator=(self_type rhs)
00188     {
00189       return this->exact().assign(rhs.exact());
00190     }
00191 
00192     static std::string
00193     name()
00194     {
00195       return
00196         std::string("image3d<")
00197         + ntg_name(T) + ","
00198         + Exact::name() + ">";
00199     }
00200 
00202 
00203     template<class U>
00204     struct mute
00205     {
00206       typedef image3d<U> ret;
00207     };
00208 
00209     image3d(const self_type& rhs); // w/o impl
00210 
00211   protected:
00212 
00214     exact_type
00215     clone_() const
00216     {
00217       exact_type output(this->nslices(), this->nrows(),
00218                         this->ncols(), this->border());
00219       clone_to(output.impl());
00220       return output;
00221     }
00222 
00223   };
00224 
00230   template <class T, class Exact>
00231   struct dim_traits<3, T, Exact>
00232   {
00233     typedef image3d<T, Exact> img_type;
00234   };
00235 } // end of oln
00236 
00237 #endif // ! OLENA_CORE_IMAGE3D_HH

Generated on Thu Apr 15 20:13:11 2004 for Olena by doxygen 1.3.6-20040222