image.hh 4.66 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Copyright (C) 2001, 2003, 2004, 2005, 2006 EPITA Research and
// Development Laboratory
//
// This file is part of the Olena Library.  This library is free
// software; you can redistribute it and/or modify it under the terms
// of the GNU General Public License version 2 as published by the
// Free Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
Roland Levillain's avatar
Roland Levillain committed
15
16
17
// along with this library; see the file COPYING.  If not, write to
// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
// Boston, MA 02111-1307, USA.
18
19
20
21
22
23
24
25
26
27
28
//
// As a special exception, you may use this file as part of a free
// software library without restriction.  Specifically, if other files
// instantiate templates or use macros or inline functions from this
// file, or you compile this file and link it with other files to
// produce an executable, this file does not by itself cause the
// resulting executable to be covered by the GNU General Public
// License.  This exception does not however invalidate any other
// reasons why the executable file might be covered by the GNU General
// Public License.

29
30
#ifndef OLN_CORE_ABSTRACT_IMAGE_HH
# define OLN_CORE_ABSTRACT_IMAGE_HH
31

32
# include <oln/core/typedefs.hh>
33
# include <oln/core/abstract/fwd_decls.hh>
34
# include <oln/core/automatic/image/image.hh>
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56


namespace oln
{

  /*! \namespace oln::abstract
  ** \brief oln::abstract namespace.
  */
  namespace abstract {


    /*! \class abstract::image<E>
    **
    ** The abstract::image class is the base class from whom derives
    ** every concrete image class.  Basically, an image is a set of
    ** points and a set of values associated with those points.
    **
    ** Parameter E is the exact type of image.
    */


    template <typename E>
57
    struct image : public virtual stc::any__simple<E>,
58
		   public virtual oln::type,
59
		   public automatic::get_impl<image, E>
60
61
    {

62
    public:
63

64
65
      struct decl
      {
66
67
// 	oln_virtual_typedef(topo);
// 	oln_virtual_typedef(grid);
68

69
70
// 	oln_virtual_typedef(coord);

71
72
// 	oln_virtual_typedef(psite);
// 	oln_virtual_typedef(point);
73

74
75
76
// // 	oln_virtual_typedef(piter);
// // 	oln_virtual_typedef(fwd_piter);
// // 	oln_virtual_typedef(bkd_piter);
77

78
79
// 	oln_virtual_typedef(value);
// 	oln_virtual_typedef(rvalue);
80

81
// 	oln_virtual_typedef(concrete);
82

83
// 	oln_virtual_typedef(morpher);
84

85
	decl();
86
      };
87
88


89
    private:
90

91
92
93
94
      /// Typedefs.
      typedef oln_type_of(E, topo)   topo_t;
      typedef oln_type_of(E, psite)  psite_t;
      typedef oln_type_of(E, rvalue) rvalue_t;
95
96


97
    public:
98
99

      /*------------------*
100
       ! abstract methods !
101
102
       *------------------*/

103
104
105
      /*! \brief Return the topological information about the current
      **  image.  Nota bene: this method is abstract-like.it is a
      **  pseudo-abstract method.
106
      **
107
108
109
      ** \return An object deriving from abstract::topo.  Ex: if the
      ** image is an image2d<something>, the returned object is a
      ** topo2d.
110
111
      */

112
      const topo_t& topo() const;
113
114
115


      /*! \brief Gives access to the value stored at \a p in the
116
      ** current image.
117
118
      */

119
      rvalue_t operator()(const psite_t& p) const;
120
121
122
123
124

    protected:

      /*! \brief Constructor (protected, empty).
      */
125
      image();
126

127
      /*! \brief Destructor.
128
      */
129
      virtual ~image();
130
131
132
133

    };


134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# ifndef OLN_INCLUDE_ONLY

    template <typename E>
    image<E>::decl::decl()
    {
// 	  mlc::assert_< mlc_is_a(topo,      abstract::topology)           >::check();
// 	  mlc::assert_< mlc_is_a(grid,      abstract::grid)               >::check();
// 	  mlc::assert_< mlc_is_a(piter,     abstract::iterator_on_points) >::check();
// 	  mlc::assert_< mlc_is_a(fwd_piter, abstract::iterator_on_points) >::check();
// 	  mlc::assert_< mlc_is_a(bkd_piter, abstract::iterator_on_points) >::check();
	  // FIXME: Rec.
	  // mlc::assert_< mlc_is_a(concrete,  abstract::image)              >::check();
    }

    template <typename E>
    image<E>::image()
    {
    }

    template <typename E>
    image<E>::~image()
    {
      decl();
    }

    template <typename E>
    const typename image<E>::topo_t&
    image<E>::topo() const
    {
      return this->exact().impl_topo();
    }

    template <typename E>
    typename image<E>::rvalue_t
    image<E>::operator()(const typename image<E>::psite_t& p) const
    {
      return this->exact().impl_op_read(p);
    }

# endif



177
178
179
180
181
  } // end of namespace oln::abstract

} // end of namespace oln


182
#endif // ! OLN_CORE_ABSTRACT_IMAGE_HH