Commit 44a94cb2 authored by Roland Levillain's avatar Roland Levillain
Browse files

Start to work around clang++ deficiencies to compile Milena.

	* mln/util/tracked_ptr.hh (tracked_ptr<T>::operator*): New.
	* mln/topo/complex.hh: Decompose complex instructions.
parent 9f51f7b4
2010-11-29 Roland Levillain <roland@lrde.epita.fr>
Start to work around clang++ deficiencies to compile Milena.
* mln/util/tracked_ptr.hh (tracked_ptr<T>::operator*): New.
* mln/topo/complex.hh: Decompose complex instructions.
2012-10-08 Roland Levillain <roland@lrde.epita.fr> 2012-10-08 Roland Levillain <roland@lrde.epita.fr>
   
Revive headers required by the RGB component functors. Revive headers required by the RGB component functors.
...@@ -479,9 +479,13 @@ namespace mln ...@@ -479,9 +479,13 @@ namespace mln
n_face<0u, D> n_face<0u, D>
complex<D>::add_face() complex<D>::add_face()
{ {
// Upcast `data_' to get access to the field `faces_' of its
// base class `internal::faces_set_mixin<0u, D>'.
std::vector< face_data<0u, D> >& faces_0 =
static_cast< internal::faces_set_mixin<0u, D>& >(*data_).faces_;
/* FIXME: This is not thread-proof (these two lines should /* FIXME: This is not thread-proof (these two lines should
form an atomic section). */ form an atomic section). */
data_->internal::faces_set_mixin<0u, D>::faces_.push_back(face_data<0u, D>()); faces_0.push_back(face_data<0u, D>());
unsigned id = nfaces_of_static_dim<0u>() - 1; unsigned id = nfaces_of_static_dim<0u>() - 1;
return n_face<0u, D>(*this, id); return n_face<0u, D>(*this, id);
} }
...@@ -505,9 +509,13 @@ namespace mln ...@@ -505,9 +509,13 @@ namespace mln
} }
face_data<N + 1, D> f; face_data<N + 1, D> f;
// Upcast `data_' to get access to the field `faces_' of its
// base class `internal::faces_set_mixin<N + 1, D>'.
std::vector< face_data<N + 1, D> >& faces_n_plus_1 =
static_cast< internal::faces_set_mixin<N + 1, D>& >(*data_).faces_;
/* FIXME: This is not thread-proof (these two lines should /* FIXME: This is not thread-proof (these two lines should
form an atomic section). */ form an atomic section). */
data_->internal::faces_set_mixin<N + 1, D>::faces_.push_back(f); faces_n_plus_1.push_back(f);
unsigned id = nfaces_of_static_dim<N + 1>() - 1; unsigned id = nfaces_of_static_dim<N + 1>() - 1;
n_face<N + 1, D> fh(*this, id); n_face<N + 1, D> fh(*this, id);
...@@ -587,7 +595,11 @@ namespace mln ...@@ -587,7 +595,11 @@ namespace mln
unsigned unsigned
complex<D>::nfaces_of_static_dim() const complex<D>::nfaces_of_static_dim() const
{ {
return data_->internal::faces_set_mixin<N, D>::faces_.size(); // Upcast `data_' to get access to the field `faces_' of its
// base class `internal::faces_set_mixin<N, D>'.
const std::vector< face_data<N, D> >& faces_n =
static_cast< const internal::faces_set_mixin<N, D>& >(*data_).faces_;
return faces_n.size();
} }
...@@ -616,7 +628,11 @@ namespace mln ...@@ -616,7 +628,11 @@ namespace mln
face_data<N, D>& face_data<N, D>&
complex<D>::face_data_(unsigned face_id) complex<D>::face_data_(unsigned face_id)
{ {
return data_->internal::faces_set_mixin<N, D>::faces_[face_id]; // Upcast `data_' to get access to the field `faces_' of its
// base class `internal::faces_set_mixin<N, D>'.
std::vector< face_data<N, D> >& faces_n =
static_cast< internal::faces_set_mixin<N, D>& >(*data_).faces_;
return faces_n[face_id];
} }
template <unsigned D> template <unsigned D>
...@@ -625,7 +641,11 @@ namespace mln ...@@ -625,7 +641,11 @@ namespace mln
const face_data<N, D>& const face_data<N, D>&
complex<D>::face_data_(unsigned face_id) const complex<D>::face_data_(unsigned face_id) const
{ {
return data_->internal::faces_set_mixin<N, D>::faces_[face_id]; // Upcast `data_' to get access to the field `faces_' of its
// base class `internal::faces_set_mixin<N, D>'.
const std::vector< face_data<N, D> >& faces_n =
static_cast< const internal::faces_set_mixin<N, D>& >(*data_).faces_;
return faces_n[face_id];
} }
template <unsigned D> template <unsigned D>
...@@ -678,7 +698,9 @@ namespace mln ...@@ -678,7 +698,9 @@ namespace mln
void void
complex<D>::print(std::ostream& ostr) const complex<D>::print(std::ostream& ostr) const
{ {
data_->internal::faces_set_mixin<D, D>::print_rec_asc(ostr); // Upcast `data_' to get access to the method `print_rec_asc' of
// its base class `internal::faces_set_mixin<D, D>'.
static_cast< const internal::faces_set_mixin<D, D>& >(*data_).print_rec_asc(ostr);
} }
template <unsigned D> template <unsigned D>
...@@ -690,7 +712,9 @@ namespace mln ...@@ -690,7 +712,9 @@ namespace mln
// Ensure N is compatible with D. // Ensure N is compatible with D.
metal::bool_< N <= D >::check(); metal::bool_< N <= D >::check();
data_->internal::faces_set_mixin<N, D>::print(ostr); // Upcast `data_' to get access to the method `print' of its
// base class `internal::faces_set_mixin<N, D>'.
static_cast< const internal::faces_set_mixin<N, D>& >(*data_).print(ostr);
} }
template <unsigned D> template <unsigned D>
...@@ -842,7 +866,9 @@ namespace mln ...@@ -842,7 +866,9 @@ namespace mln
T T
complex<D>::fold_left_(const BinaryFunction& f, const T& accu) const complex<D>::fold_left_(const BinaryFunction& f, const T& accu) const
{ {
return data_->internal::faces_set_mixin<D, D>::fold_left_(f, accu); // Upcast `data_' to get access to the method `fold_left_' of
// its base class `internal::faces_set_mixin<D, D>'.
return static_cast< const internal::faces_set_mixin<D, D>& >(*data_).fold_left_(f, accu);
} }
namespace internal namespace internal
...@@ -857,7 +883,9 @@ namespace mln ...@@ -857,7 +883,9 @@ namespace mln
faces_set_mixin<D, D>::fold_left_(const BinaryFunction& f, faces_set_mixin<D, D>::fold_left_(const BinaryFunction& f,
const T& accu) const const T& accu) const
{ {
return faces_set_mixin<D - 1, D>::fold_left_(f, f(accu, faces_)); // Upcast `data_' to get access to the method `fold_left_' of
// its base class `internal::faces_set_mixin<D - 1, D>'.
return static_cast< const faces_set_mixin<D - 1, D>& >(*this).fold_left_(f, f(accu, faces_));
} }
template <unsigned N, unsigned D> template <unsigned N, unsigned D>
...@@ -867,7 +895,9 @@ namespace mln ...@@ -867,7 +895,9 @@ namespace mln
faces_set_mixin<N, D>::fold_left_(const BinaryFunction& f, faces_set_mixin<N, D>::fold_left_(const BinaryFunction& f,
const T& accu) const const T& accu) const
{ {
return faces_set_mixin<N - 1, D>::fold_left_(f, f(accu, faces_)); // Upcast `data_' to get access to the method `fold_left_' of
// its base class `internal::faces_set_mixin<N - 1, D>'.
return static_cast< const faces_set_mixin<N - 1, D>& >(*this).fold_left_(f, f(accu, faces_));
} }
template <unsigned D> template <unsigned D>
...@@ -904,7 +934,9 @@ namespace mln ...@@ -904,7 +934,9 @@ namespace mln
{ {
// Ensure N is compatible with D. // Ensure N is compatible with D.
mln_precondition(n <= D); mln_precondition(n <= D);
return data_->internal::faces_set_mixin<D, D>::apply_if_dim_matches_(n, f); // Upcast `data_' to get access to the method `apply_if_dim_matches_' of
// its base class `internal::faces_set_mixin<D, D>'.
return static_cast< const internal::faces_set_mixin<D, D>& >(*data_).apply_if_dim_matches_(n, f);
} }
namespace internal namespace internal
......
// Copyright (C) 2006, 2007, 2008, 2009 EPITA Research and Development // Copyright (C) 2006, 2007, 2008, 2009, 2010 EPITA Research and
// Laboratory (LRDE) // Development Laboratory (LRDE)
// //
// This file is part of Olena. // This file is part of Olena.
// //
...@@ -63,6 +63,16 @@ namespace mln ...@@ -63,6 +63,16 @@ namespace mln
/// Negation (for arithmetical tests). /// Negation (for arithmetical tests).
bool operator !() const; bool operator !() const;
/// Mimics the behavior of op* for a pointer in the const case.
///
/// \invariant Pointer proxy exists.
const T& operator*() const;
/// Mimics the behavior of op* for a pointer in the mutable case.
///
/// \invariant Pointer proxy exists.
T& operator*();
/// Mimics the behavior of op-> for a pointer in the const case. /// Mimics the behavior of op-> for a pointer in the const case.
/// ///
/// \invariant Pointer proxy exists. /// \invariant Pointer proxy exists.
...@@ -117,6 +127,24 @@ namespace mln ...@@ -117,6 +127,24 @@ namespace mln
return ! bool(*this); return ! bool(*this);
} }
template <typename T>
inline
const T& tracked_ptr<T>::operator*() const
{
mln_invariant(run_());
mln_precondition(ptr_ != 0);
return *ptr_;
}
template <typename T>
inline
T& tracked_ptr<T>::operator*()
{
mln_invariant(run_());
mln_precondition(ptr_ != 0);
return *ptr_;
}
template <typename T> template <typename T>
inline inline
const T* tracked_ptr<T>::operator->() const const T* tracked_ptr<T>::operator->() const
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment