• Thierry Geraud's avatar
    Huge summer cleanup. · 34bf6dae
    Thierry Geraud authored
    
    	
    	Part 0:  New metal stuff for use in proxy-related meta-programs.
    	----------------------------------------------------------------
    
    
    	
    	* mln/metal/unqualif.hh (todo): New.
    	* mln/metal/const.hh (const_): New overloads for pointers.
    	* mln/metal/is_a.hh (is_a): New overload to handle & and const&.
    	(make_): Likewise.
    	* mln/metal/is.hh (is): New overload to handle constness.
    	* mln/metal/unref.hh (unref): New overload to handle const&.
    	* mln/metal/is_not_ref.hh: New.
    	* mln/metal/is_ref.hh: New.
    	* mln/metal/ref.hh: New.
    
    	
    
    	Part I:  Cleanup traits.
    	------------------------
    
    	
    	
    	Reduce dependencies between trait structures and the solving
    	meta-programs.  Forward declarations of the latter are included
    	before the definition of trait structures and meta-programs are
    	eventually included at EOF.
    
    	
    	* mln/trait/op/decl.hh: New.  Forward declare the couple of
    	solving meta-programs.
    
    	* mln/trait/op/leq.hh,
    	* mln/trait/op/times.hh,
    	* mln/trait/op/div.hh,
    	* mln/trait/op/plus.hh,
    	* mln/trait/op/neq.hh,
    	* mln/trait/op/greater.hh,
    	* mln/trait/op/minus.hh,
    	* mln/trait/op/not.hh,
    	* mln/trait/op/postdec.hh,
    	* mln/trait/op/predec.hh,
    	* mln/trait/op/and.hh,
    	* mln/trait/op/eq.hh,
    	* mln/trait/op/less.hh,
    	* mln/trait/op/xor.hh,
    	* mln/trait/op/uplus.hh,
    	* mln/trait/op/geq.hh,
    	* mln/trait/op/mod.hh,
    	* mln/trait/op/postinc.hh,
    	* mln/trait/op/preinc.hh,
    	* mln/trait/op/uminus.hh,
    	* mln/trait/op/or.hh: Update.
    
    	Group category materials in the same file.
    	
    	* mln/trait/solve.hh (super_category_): Move...
    	* mln/category.hh: ...here.
    	Consequently mln::trait::internal::super_category_ is now
    	mln::internal::super_category_.
    
    	Allow the category associated type to hold extra information.  In
    	particular we need for proxy to carry the super category
    	information.  For that, in meta-programs, it is now used as a
    	'regular' type (no more as a meta-type), e.g., we propagate
    	'Image<void>' as a parameter in meta-programs instead of 'Image'.
    	In the case of multiple possible super categories, for instance
    	for builtin types, we have 'Category<Super_Category>'.
    	
    	* mln/trait/solve_unary.hh (trait_set_unary_): New.  This
    	structure removes the parameter of the category to access the
    	definition of trait::set_unary_.
    	(Category_T): Replace in meta-code this meta-class parameter by...
    	(Category): ...this class parameter.
    	* mln/trait/solve_binary.hh: Likewise.
    
    	* tests/trait/super.cc,
    	* mln/value/builtin/symbolics.hh,
    	* mln/value/builtin/floatings.hh,
    	* mln/value/builtin/integers.hh: Update.
    
    
    	
    	PART II.  Make the default coordinate type easily changeable.
    	-------------------------------------------------------------
    
    
    	
    	Introduce a one-place definition of the default coordinate used in
    	point2d and related classes.  This definition is changed from
    	"int" to "short int" to save memory when containers of coordinates
    	are involved.
    	
    	* mln/core/def: New directory for definitions.
    	* mln/core/def/coord.hh: New.
    	* mln/core/dpoint.hh,
    	* mln/core/point.hh: Include this new file.
    
    	* mln/core/dpoint2d.hh,
    	* mln/core/point1d.hh,
    	* mln/core/point2d.hh,
    	* mln/core/point3d.hh,
    	* mln/make/box3d.hh,
    	* mln/make/dpoint1d.hh,
    	* mln/make/dpoint2d.hh,
    	* mln/make/dpoint3d.hh,
    	* mln/make/box1d.hh,
    	* mln/make/box2d.hh,
    	* mln/make/box3d.hh,
    	* mln/make/point1d.hh,
    	* mln/make/point2d.hh,
    	* mln/make/point3d.hh,
    	* mln/trait/image/props.hh (int): Replace by...
    	(def::coord): ...this.
    
    	
    
    	PART III.  Make the proxy mechanism more powerful.
    	--------------------------------------------------
    
    	
    
    	The proxy mechanism can now handle the several cases in the nature
    	of the subject:
    	- with type "T", the subject is a temporary object or an object
    	  copy;
    	- with type "T&", the subject is modifiable through a non-const
    	  proxy;
    	- with type "const T&", the subject is handle by reference (not
    	  copied) yet it is never modifiable.
    
    	
    	The "unproxy()" method is split into:
    	- unproxy_() [const]
    	  These methods are automatically inherited thru internal::proxy_impl.
    	  The '_' suffix emphasizes their technical-detail (non-user) nature.
    	- subj_()
    	  This method has to be defined in proxy concrete classes.  It
    	  shall return the immediate subject of the proxy.  This not-const
    	  method is unique.  A proper "unproxy_() const" method is defined
    	  from it.
    
    	The "subject" typedef is replaced by "q_subject" which is
    	qualified (so that the proxy mechanism can handle different cases
    	described above).  This typedef is no more defined explicitly by
    	the client, it is automatically set thanks to inheritance with the
    	first parameter of the internal::proxy_impl class.
    	
    	* mln/core/concept/proxy.hh (unproxy): Replace this const method
    	by...
    	(subj_): ...this mutable one.
    	(subject): Remove this typedef.
    	(FIXME): Fix'n remove.
    	(subject, unproxy_rec): New external material to access the actual
    	subject type and object.  If we have a proxy to a proxy, that is, a
    	recursive construction, the subject at end is returned.
    	* mln/core/macros.hh (mln_q_subject): New.
    	(mln_subject): Deactivate for safety purpose.  The user should not
    	have to access the actual subject type. 
    	
    	Recap:
    	
    	- P::q_subject is the qualified immediate subject
    	  (that may be itself a proxy type)
    	v.
    	- subject<P> is the subject type at end 
    	  (it cannot be a proxy type)
    
    	- p.subject_() gives the immediate subject object
    	  (which may be a proxy object)
    	v.
    	- unproxy_rec(p) gives the subject object at end
    	  (it cannot be a proxy object).
    	
    	* mln/core/concept/proxy.hh
    	(Proxy): Update ctor to perform the proper checks.
    	(unproxy_couple): Rename as...
    	(helper_unproxy_binop): ...this.
    	(mln_def_binop_proxy, operator, set_unary_, set_binary_): Update.
    	(internal): Move material into...
    	* mln/core/concept/proxy.hxx: ...this new file.
    	(helper_subject_of, helper_unproxy_rec, helper_get_proxy_impl):
    	New helpers to handle the different cases.
    
    	Proxies are automatically equipped with some new material:
    	
    	* mln/core/concept/proxy.hxx:
    	(q_subject, unproxy_): New in proxy_impl.
    	(HOT_actual_subject, get_subject): New in helper_get_proxy_impl
    	when recursion ends, that is, when the subject is no more a proxy.
    	(subject_impl): New structure to be specialized (see below).
    	
    	IMPORTANT:
    	
    	For a proxy to look like an actual subject, it shall have the
    	interface of the later.  For that, the "subject_impl"
    	parameterized structure has to be specialized.  See
    	mln/core/point2d.hh for an example.
    	
    	Consequently to the modifications of the proxy mechanism, some
    	pieces of code are now obsolete:
    	
    	* mln/accu/internal/base.hh (q_subject, subject, unproxy): Remove.
    	(subj_): New.
    	(base_): Pass the qualified R type as parameter to proxy_impl.
    	* mln/core/concept/site_proxy.hh (internal): Remove.  We can now
    	use the default material for all proxies.
    	* mln/core/internal/pseudo_site_base.hh (is_mutable): Remove this
    	parameter.  It is now obsolete since the immediate subject type is
    	qualified, namely the parameter P.
    	(subject, q_subject): Remove.
    	(site): Update.  It now relies on proxy material.
    	(to_site): New method.  It is now final thanks to get_subject().
    	* mln/core/internal/site_relative_iterator_base.hh
    	(unproxy): Replace by...
    	(subj_): ...this.
    	* mln/core/internal/site_iterator_base.hh: Likewise.
    	(site_impl): Remove this obsolete inheritance.  Now the
    	implementation is offered by the proxy mechanism.
    	(operator site, to_site): Update; use get_subject.
    	* mln/core/point2d.hh (site_const_impl, site_impl): Replace by...
    	(subject_impl): ...these.
    
    	Last.
    	
    	* doc/tutorial/examples/proxy.cc: New.
    
    	
    	
    	PART IV.  Add some utility code.
    	--------------------------------
    
    
    	
    	The main idea is to provide iterators for util::set and
    	util::array so that such structures can be involved in some site
    	set types with a common interface.  In particular, they can be
    	used by the new material of mln/core/p_double.hh
    
    
    	Finalize the util::set class.  It is now fully functional.  A
    	major improvement is that the method ".has()" does no more require
    	that the data are unfrozen.
    	
    	* mln/util/set.hh (set_fwd_iter, set_bkd_iter): New classes.
    	(fwd_iter, bkd_iter, iter): New typedefs.
    	(first_element, last_element, memory_size): New.
    	(is_frozen_): New.  Hum... we should think of adding a public
    	freeze method.
    	(has): Now work when the set is frozen thanks to...
    	(v_has_, dicho_): ...these new private methods.
    	(insert): New overload with a set as argument.
    	(remove): New method.
    	(todo): Remove; done.
    	(todo): New.
    	(documentation): Layout.
    	(vect): Rename this method as...
    	(std_vector): ...this more explicit name.
    	(operator<<): Change the output.
    
    	A new class, util::array, is introduce.  It is nearly a regular
    	dynamic array expect that it will provide a remove-element method
    	with O(1) complexity.  This feature is not yet implemented (see
    	the todo).
    	
    	* mln/util/array.hh: New.
    
    	Misc.
    	
    	* mln/core/contract.hh (mln_implies): Replace this macro by...
    	(implies): ...this routine.  Nota: the macro did not work!
    	* mln/core/macros.hh
    	(mln_bkd_iter, mln_fwd_iter, mln_iter): New.
    	(mln_element): New.
    	* mln/fun/v2v/inc.hh: New.
    	* mln/fun/v2v/dec.hh: New.
    	* mln/util/index.hh (operator++, operator--): New.
    	(todo): New.
    	* mln/util/timer.hh: New.
    	* mln/util/yes.hh (operator==, operator!=): New overloads.
    	* mln/util/less.hh (op_less, op_less_or_equal): New.
    	* mln/value/viter.hh (change_target, index_): New.
    	(fwd_viter_, bkd_viter_): New overload ctor without argument.
    
    
    	
    	PART V.  Cleanup site set definitions.
    	--------------------------------------
    
    	
    
    	A lot of work here has been done to FACTOR (!) code and make it
    	safer.
    	
    	
    	First add a re-target feature to pseudo sites.
    
    	* mln/core/concept/pseudo_site.hh (target_t): Rename this typedef
    	as...
    	(target): ...this.
    	(target_, change_target): New methods expected in concrete
    	classes.
    	(has_target): New final method.
    	(if_possible::change_target): Update.
    	* mln/core/macros.hh (mln_target_): New.
    	
    	Add some methods in the site set interface.
    	
    	* mln/core/concept/site_set.hh (is_valid): New method.  Some site
    	set types are always valid, some others can sometimes be
    	invalid (think of an initialized box!)
    	(memory_size): New.
    	(i_element, insert): New methods expected by site sets with
    	"dynamic contents".
    	(r_element, remove): New methods expected by site sets with "free
    	contents".  Nota bene: having a "growing contents" means that no
    	removal is possible.
    	(q_box): New typedef expected by site sets knowing their bounding
    	box.
    	(bbox): Turn this method into optional.
    	(internal): New material to check the presence of methods that
    	some site sets feature.
    	(Site_Set): Use this material to check the presence of the nsites,
    	bbox, insert, and remove methods.
    	(todo): Remove; done.
    	* mln/accu/bbox.hh (box_): Update to...
    	(box): ...the new class name.
    	(take): Rely on is_valid instead of nsites.
    	* mln/core/box.hh,
    	* mln/core/p_queue_fast.hh,
    	* mln/core/p_priority_queue.hh,
    	* mln/core/p_set.hh,
    	* mln/core/line2d.hh,
    	* mln/core/p_run.hh,
    	* mln/core/p_run_piter.hh,
    	* mln/core/p_array.hh,
    	* mln/core/p_runs.hh: Update.
    	* mln/core/concept/box.hh (q_box): New typedef.
    	(nsites): Handle the case of a non-initialized box.
    	* doc/tutorial/examples/cpp_issue.cc: New.  It illustrates the
    	impossibility of having a "typedef box" (and thus a method having
    	for signature "box bbox() const") due to the type "box<P>".
    
    	Some site set types are indexed (featuring an operator[]).  The
    	triplet of psite, fwd_piter, and bkd_piter is factored for such
    	types.  It is the case for:
    	- p_array<P>
    	- p_set<P>
    	- line2d.
    
    	* mln/core/p_array.hh (p_array_psite): Rename as...
    	(p_indexed_psite): ...this and update.
    	(p_indexed_fwd_piter, p_indexed_bkd_piter): New iterators.
    	(psite, fwd_piter, bkd_piter): Update.
    	(trait): Update.
    	(element, piter, i_element): New typedefs.
    	(has_index): Remove; replace by...
    	(has): ...this overload with util::index.
    	(operator[]): New overload with util::index.
    	(vect): Rename as...
    	(std_vector): ...this.
    	(memory_size, hook_std_vector_): New.
    	* mln/core/p_set.hh: Likewise.
    	(p_set): Change inheritance (remove dependency on set_of_) into
    	delegation with...
    	(s_): ...this new attribute whose type is util::set.
    	(remove): Re-activate and make it work.
    	(bb_, bbox): Remove because it is too costly to maintain.
    	* mln/core/p_array_piter.hh: Obsolete changes.
    	* mln/core/line2d.hh
    	(vect_): Change this attribute to...
    	(arr_): ...this new one with type being a p_array.
    	(beg_, end_): Remove those useless attributes.
    	(begin, end, bbox): New methods.
    	(line2d): Update like previous site set types.
    	* doc/tutorial/examples/line2d.cc: New.
    	
    	Re-vamp the p_queue_fast so that it completely relies on p_array.
    	
    	* mln/core/p_queue_fast.hh (include): Remove about all
    	includes (useless!).  Add p_array.hh.
    	(trait): Update.
    	(element, psite, piter): New typedefs.
    	(fwd_piter, bkd_piter): Now use the indexed iterators.
    	(has): Replace by...
    	(compute_has): ...this re-written method.
    	(has): Now take a psite (!)
    	(npoints, vect): Rename as...
    	(nsites, std_vector): ...these.
    	(bbox, push_force, is_empty): Remove.
    	(i_element, insert, purge, memory_size): New.
    	(bb_, vect_needs_update_): Remove.  They are useless since:
    	(q_): Change type from std::vector to p_array.
    	(begin_, end_): Change type from std::size_t to unsigned.
    	(operator[]): New.
    	(p_queue_fast, reserve, clear, pop, push): Re-write.
    	(pop_front): Fix missing precondition.
    
    	Completely re-write the priority queue class so that this class is
    	unique.  Put differently we had three classes:
    	- p_priority_queue
    	- p_priority_queue_fast
    	- p_priority_queue_fast_with_array
    	and now we have one factored class:
    	- p_priority!
    	Yet this class does not handle a bounding box (to be implemented).
    	
    	* mln/core/p_priority_queue.hh (p_priority_queue): Rename as...
    	(p_priority): ...this.
    	Re-write completely and update; noticeable changes are:
    	(T): Replace this element-type parameter by...
    	(Q): ...this new parameter; it is the queue-type.
    	(bbox, operator[], push_force): Remove these methods.
    	(insert): New method.
    	(exists_priority, operator()): New methods.
    	(lowest_priority, highest_priority): New methods.
    	
    	* doc/tutorial/examples/p_queue.cc: New.  Illustrate what can be
    	done with both p_queue_fast and p_priority_queue.
    
    	About site sets based on runs, cleanup and speedup code.
    	A couple of important remarks:
    	- p_run<P> does not rely on p_indexed stuff because the dedicated
    	  code is more efficient; just think of calling .next() and
    	  computing the i-th point (slow) instead of just
    	  inc/dec-rementing the last coordinate (fast).
    	- p_runs<P> is a transition class between has-been code and
    	  will-be code; it will be automatically replaced by composite
    	  site set types s.a. p_array_of< p_run<P> >.
    
    	* mln/core/p_run.hh: Update like previous site set types.
    	(set_run): Rename this method as...
    	(init): ...this.  It is now consistent with other lib types.
    	(p_): Rename this attribute as...
    	(start_): ...this more explicit name.
    	(first): Rename this method as...
    	(start): ...this.
    	(end): New method.
    	(bb_): Remove this attribute since it is easily and efficiently
    	computable.
    	(is_valid_): Likewise.
    	(bbox): Update; now return by copy.
    	(std::size_t): Change this type of length into...
    	(unsigned short): ...this sufficient type.
    	(util::less): New specialization.
    	(psite, piter): New typedefs.
    	(p_run_psite): New.  There was no psite for p_run!  Instead a type
    	of point was used so there was no very efficient ".has(p)"
    	method...
    	(has): Overload for psite.  It is quick :-)
    	* mln/core/p_run_piter.hh: Update.
    	(assign_run, to_point, operator[], ind, operator P): Remove; now
    	obsolete because factored in super classes.
    	(i_, p_, run_, is_valid_): Likewise for these attributes.
    	* mln/core/p_runs.hh (p_runs): Rename as...
    	(p_run_set): ...this.
    	(fwd_piter, bkd_piter): Use p_double stuff; see below.
    	Update the full class file.  Nota bene: this class will be soon
    	obsolete!  Yet to bench the difference after changes we keep track
    	of an up-to-date version:
    	* sandbox/geraud/p_runs__with_dedicated_piter.hh: Copy of previous
    	code to bench purpose.
    	* doc/benchmark/p_runs.cc: New.
    	* doc/tutorial/examples/p_run_set.cc: New.
    	* mln/convert/to_p_run_set.hh: New.
    
    	Add composite site set types, meaning types for "composites of
    	site sets".  For instance, a dynamic array of site sets or a
    	mathematical set of site sets.
    	
    	* mln/core/p_double.hh: New.
    	* mln/core/p_mutable_array_of.hh: New.
    	* mln/core/p_set_of.hh: New.
    	* doc/tutorial/examples/p_mutable_array_of.cc: New.
    
    	New site set types that are value-oriented.
    	
    	* mln/core/p_vaccess.hh: New.
    	* mln/core/obsolete_p_vaccess.hh: New.
    	* mln/core/p_key.hh: New.
    	* doc/tutorial/examples/p_vaccess.cc: New.
    	* doc/tutorial/examples/p_key.cc: New.
    	* doc/tutorial/examples/p_key.2.cc: New.
    
    	Misc.
    	
    	* mln/core/p_queue.hh (npoints): Rename as...
    	(nsites): ...this.
    	(is_empty): Remove; obsolete.
    	* mln/core/internal/site_set_base.hh
    	(is_empty): New method; it dispatches to is_empty_.
    	(is_empty_): New default implementation based on the nsites
    	method.  This method has to be overridden by sub-classes that can
    	test their emptiness though they do not feature the nsites method.
    	* mln/core/concept/site_set.hh (insert_all): Replace this method by...
    	(operator+=): ...this external operator and add static checks.
    	* doc/tutorial/examples/image2d.cc,
    	* doc/tutorial/examples/window.cc: Update.
    	* mln/trait/site_set/props.hh (todo): New.
    	(contents::free): Fix typo in return of the name() method.
    	
    	Last.
    
    	* mln/trait/site_set/status.txt: Layout and update.  That is THE
    	reference file to know the work done v. remaining to be done on
    	site sets.
    
    
    	
    	PART VI.  Some work on image types.
    	-----------------------------------
    
    
    	Cleanup the internal classes.
    	
    	* mln/core/internal/data.hh (todo): New.
    	* mln/core/internal/image_base.hh (morpher_lvalue_): Move into...
    	* mln/core/internal/morpher_lvalue.hh: ...this new file.
    	* mln/core/internal/check/image_all.hh: Typo.
    	* mln/core/internal/check/image_fastest.hh (ctor): Fix a missing
    	static check.
    	* mln/core/internal/image_identity.hh
    	(image_identity_impl__fastest, image_identity_impl): New.
    	Actually this new code should be located elsewhere.
    
    	Bench image2d and compare iterations with different
    	implementations.
    	
    	* mln/core/point.hh (operator[]): Change return from "C" to "const
    	C&".
    	(last_coord): New.
    	(plus_infty, minus_infty): New.
    	(cut_): New.
    	* mln/core/internal/coord_impl.hh
    	(ind, row, col, sli): Change return from "C" to "const C&".
    	* mln/core/window.hh: Update.
    	* mln/core/box_piter.hh (next_): Speedup a bit.
    	* mln/core/image2d.hh (alt): New temporary method to bench purpose.
    	* doc/benchmark/image2d.cc: New.
    
    	First attempt to deal with temporary mutable morphers.
    	
    	* mln/core/image: New directory.
    	* mln/core/image/all.hh,
    	* mln/core/image/instant.hh: New files.
    	* mln/core/sub_image.hh (operator|): New overload for instant
    	images.
    	* mln/level/fill_with_value.hh (fill_with_value): Likewsie. 
    	* doc/tutorial/examples/sub_image.cc: Use fill_with_value to show
    	that instant morphers can be mutable.
    
    	Start to update p_run-based image types.
    
    	* mln/core/sparse_image.hh: Update using p_run_set<P>.
    
    	Misc.
    	
    	* mln/core/plain.hh (include): Remove useless dependence on
    	algebra::vec.
    	* mln/pw/image.hh (speed): Fix wrong property.
    
    
    	
    	PART VII.  What is not in previous parts.
    	-----------------------------------------
    
    	
    	
    	* doc/tutorial/examples/p_array.cc: Replace some dynamic
    	assertions by static checks.
    	* mln/core/concept/gdpoint.hh (todo): New.
    	* mln/core/internal/piter_adaptor.hh
    	(pi_change_target_): New default implementation.
    	(pi_set_from_): Remove this method expected in subclasses.
    	(change_target): Call pi_change_target_.
    	* mln/core/pset_if_piter.hh: Update.
    	* mln/debug/put_word.hh: New.
    	* mln/debug/println.hh (todo): New.
    	* mln/debug/println.spe.hh (todo): New.
    	(println): Revamp 2D version so it can work on a wider set of
    	images.  It no longer relies on the "at(row,col)" method.
    	(println): Overload for image2d<char>.
    	* mln/geom/bbox.hh (bbox_): Fix signature.
    	* mln/labeling/blobs.hh (unsigned): Replace its use by...
    	(L): ...this parameter.  That is a feature bug fix!
    	* mln/morpho/internal: New.
    	* mln/morpho/internal/elementary.hh: New.
    	* mln/morpho/gradient_elementary.hh: Use new stuff.
    	* mln/morpho/dilation_elementary.hh: Add temporary code.
    
    
    git-svn-id: https://svn.lrde.epita.fr/svn/oln/branches/cleanup-2008@2154 4aad255d-cdde-0310-9447-f3009e2ae8c0
    34bf6dae