image.hh 4.67 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.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(psite);
// 	oln_virtual_typedef(point);
71

72
73
74
// // 	oln_virtual_typedef(piter);
// // 	oln_virtual_typedef(fwd_piter);
// // 	oln_virtual_typedef(bkd_piter);
75

76
77
// 	oln_virtual_typedef(value);
// 	oln_virtual_typedef(rvalue);
78

79
// 	oln_virtual_typedef(concrete);
80

81
// 	oln_virtual_typedef(morpher);
82

83
	decl();
84
      };
85
86


87
    private:
88

89
90
91
92
      /// 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;
93
94


95
    public:
96
97

      /*------------------*
98
       ! abstract methods !
99
100
       *------------------*/

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

110
      const topo_t& topo() const;
111
112
113


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

117
      rvalue_t operator()(const psite_t& p) const;
118
119
120
121
122

    protected:

      /*! \brief Constructor (protected, empty).
      */
123
      image();
124

125
      /*! \brief Destructor.
126
      */
127
      virtual ~image();
128
129
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
# 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



175
176
177
178
179
  } // end of namespace oln::abstract

} // end of namespace oln


180
# include <oln/core/abstract/image/hierarchies.hh>
181

182

183
#endif // ! OLN_CORE_ABSTRACT_IMAGE_HH