27 #ifndef MLN_UTIL_ARRAY_HH
28 # define MLN_UTIL_ARRAY_HH
41 # include <mln/core/alias/box1d.hh>
42 # include <mln/core/concept/function.hh>
43 # include <mln/core/concept/proxy.hh>
44 # include <mln/core/concept/iterator.hh>
46 # include <mln/fun/internal/selector.hh>
55 template <
typename T>
class array;
58 template <
typename V>
struct image1d;
66 template <
typename T>
class array_fwd_iter;
67 template <
typename T>
class array_bkd_iter;
96 typedef typename std::vector<T>::const_reference
ro_result;
146 template <
typename U>
156 unsigned size()
const;
207 template <
typename T>
213 template <
typename T>
220 template <
typename T1,
typename T2>
225 template <
typename T>
231 template <
typename T,
typename U>
237 template <
typename V,
typename T>
243 template <
typename T>
245 public mln::internal::proxy_impl< const T&,
296 template <
typename T>
298 public mln::internal::proxy_impl< const T&,
350 template <
typename T,
typename E>
355 unsigned nelements()
const;
356 unsigned size()
const;
357 bool is_empty()
const;
358 ro_result operator()(
unsigned i)
const;
359 ro_result operator[](
unsigned i)
const;
360 const std::vector<T>& std_vector()
const;
363 const E& exact_()
const;
367 template <
typename T,
typename E>
371 typedef typename util::array<T>::mutable_result mutable_result;
373 void reserve(
unsigned n);
377 util::array<T>& append(
const T& elt);
379 template <
typename U>
380 util::array<T>& append(
const util::array<U>& other);
382 mutable_result operator()(
unsigned i);
383 mutable_result operator[](
unsigned i);
389 std::vector<T>& hook_std_vector_();
399 # ifndef MLN_INCLUDE_ONLY
408 template <
typename T>
414 template <
typename T>
421 template <
typename T>
428 template <
typename T>
436 template <
typename T>
444 template <
typename T>
452 template <
typename T>
461 template <
typename T>
462 template <
typename U>
467 if (other.is_empty())
471 other.std_vector().begin(), other.std_vector().end());
475 template <
typename T>
481 mln_postcondition(is_empty());
484 template <
typename T>
492 template <
typename T>
500 template <
typename T>
508 template <
typename T>
510 typename array<T>::ro_result
516 template <
typename T>
518 typename array<T>::mutable_result
524 template <
typename T>
526 typename array<T>::ro_result
533 template <
typename T>
535 typename array<T>::mutable_result
542 template <
typename T>
544 typename array<T>::ro_result
550 template <
typename T>
552 typename array<T>::mutable_result
558 template <
typename T>
566 template <
typename T>
568 const std::vector<T>&
574 template <
typename T>
582 template <
typename T>
587 return sizeof(*this) +
nelements() *
sizeof(
T);
593 template <
typename T1,
typename T2>
595 from_to_(
const array<T1>& from, array<T2>& to)
597 to.resize(from.nelements());
599 for (
unsigned i = 0; i < from.nelements(); ++i)
600 to[i] = convert::to<T2>(from[i]);
603 template <
typename T>
605 from_to_(
const array<T>& from, fun::i2v::array<T>& to)
607 to = fun::i2v::array<T>(from);
610 template <
typename T,
typename U>
612 from_to_(
const array<T>& from, fun::i2v::array<U>& to)
614 to.resize(from.nelements());
615 for (
unsigned i = 0; i < from.nelements(); ++i)
616 to(i) = convert::to<U>(from[i]);
619 template <
typename V,
typename T>
621 from_to_(
const array<V>& from, image1d<T>& to)
624 for (
unsigned i = 0; i < from.nelements(); ++i)
633 template <
typename T>
640 template <
typename T>
647 template <
typename T>
656 template <
typename T>
661 mln_precondition(a_ != 0);
665 template <
typename T>
670 mln_precondition(is_valid());
674 template <
typename T>
679 return a_ != 0 && i_ != a_->nelements();
682 template <
typename T>
688 i_ = a_->nelements();
689 mln_postcondition(! is_valid());
692 template <
typename T>
697 mln_precondition(is_valid());
698 return a_->operator[](i_);
701 template <
typename T>
703 typename array_fwd_iter<T>::subj_t
706 mln_precondition(is_valid());
707 return a_->operator[](i_);
710 template <
typename T>
723 template <
typename T>
730 template <
typename T>
737 template <
typename T>
746 template <
typename T>
751 mln_precondition(a_ != 0);
752 if (! a_->is_empty())
753 i_ = a_->nelements() - 1;
756 template <
typename T>
761 mln_precondition(is_valid());
768 template <
typename T>
773 return a_ != 0 && i_ != a_->nelements();
776 template <
typename T>
782 i_ = a_->nelements();
783 mln_postcondition(! is_valid());
786 template <
typename T>
791 mln_precondition(is_valid());
792 return a_->operator[](i_);
795 template <
typename T>
797 typename array_bkd_iter<T>::subj_t
800 mln_precondition(is_valid());
801 return a_->operator[](i_);
804 template <
typename T>
816 template <
typename T>
821 const unsigned n = a.nelements();
822 for (
unsigned i = 0; i < n; ++i)
835 template <
typename T>
839 return lhs.std_vector() == rhs.std_vector();
848 template <
typename T,
typename E>
853 exact_().get_subject().reserve(n);
856 template <
typename T,
typename E>
861 exact_().get_subject().resize(n);
864 template <
typename T,
typename E>
869 exact_().get_subject().resize(n, value);
872 template <
typename T,
typename E>
877 return exact_().get_subject().append(elt);
880 template <
typename T,
typename E>
881 template <
typename U>
886 return exact_().get_subject().append(other);
889 template <
typename T,
typename E>
894 return exact_().get_subject()(i);
897 template <
typename T,
typename E>
902 return exact_().get_subject()[i];
905 template <
typename T,
typename E>
910 exact_().get_subject().clear();
913 template <
typename T,
typename E>
918 exact_().get_subject().fill(value);
921 template <
typename T,
typename E>
926 return exact_().get_subject().hook_std_vector_();
929 template <
typename T,
typename E>
934 return internal::force_exact<E>(*this);
938 template <
typename T,
typename E>
943 return exact_().get_subject().size();
946 template <
typename T,
typename E>
951 return exact_().get_subject().nelements();
954 template <
typename T,
typename E>
959 return exact_().get_subject().is_empty();
962 template <
typename T,
typename E>
967 return exact_().get_subject()(i);
970 template <
typename T,
typename E>
975 return exact_().get_subject()[i];
978 template <
typename T,
typename E>
980 const std::vector<T>&
983 return exact_().get_subject().std_vector();
986 template <
typename T,
typename E>
991 return internal::force_exact<const E>(*this);
997 # endif // ! MLN_INCLUDE_ONLY
1002 #endif // ! MLN_UTIL_ARRAY_HH