-/*
- dimension-cache.cc -- implement Dimension_cache
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
- */
+/*
+ This file is part of LilyPond, the GNU music typesetter.
-#include "dimension-cache.hh"
-#include "parray.hh"
+ Copyright (C) 1998--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
-Dimension_cache::Dimension_cache (Dimension_cache const &d)
-{
- init();
- callback_l_ = d.callback_l_;
- empty_b_ = d.empty_b_;
- offset_ = d.offset_; //let's hope others will copy the refpoint appropriately.
-}
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
-Dimension_cache::Dimension_cache ()
-{
- init();
-}
+ LilyPond 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.
-void
-Dimension_cache::init()
-{
- callback_l_ =0;
- offset_ =0.0;
- elt_l_ = 0;
- dim_.set_empty ();
- parent_l_ =0;
- valid_b_ = false;
- empty_b_ = false;
-}
-
-
-void
-Dimension_cache::invalidate ()
-{
- valid_b_ = false;
- invalidate_dependencies ();
-}
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
+*/
-void
-Dimension_cache::invalidate_dependencies ()
-{
- for (int i=0; i < dependencies_l_arr_.size (); i++)
- {
- Dimension_cache * g = dependencies_l_arr_[i];
- if (g->valid_b_)
- {
- g->invalidate ();
- }
- }
-}
+#include "dimension-cache.hh"
-void
-Dimension_cache::set_offset (Real x)
-{
- invalidate_dependencies ();
- offset_ = x;
-}
+#include "warn.hh"
+#include "grob.hh"
-void
-Dimension_cache::translate (Real x)
+Dimension_cache::Dimension_cache (Dimension_cache const &d)
{
- invalidate_dependencies ();
- offset_ += x;
+ init ();
+ offset_ = d.offset_ ? new Real (*d.offset_) : 0;
+ parent_ = d.parent_;
+ extent_ = d.extent_ ? new Interval (*d.extent_) : 0;
}
-Real
-Dimension_cache::relative_coordinate (Dimension_cache *refp) const
+Dimension_cache &
+Dimension_cache::operator = (Dimension_cache const &d)
{
- if (refp == this)
- return 0.0;
-
- /*
- We catch PARENT_L_ == nil case with this, but we crash if we did
- not ask for the absolute coordinate (ie. REFP == nil.)
-
- */
- if (refp == parent_l_)
- return offset_;
- else
- return offset_ + parent_l_->relative_coordinate (refp);
+ clear ();
+ offset_ = d.offset_ ? new Real (*d.offset_) : 0;
+ parent_ = d.parent_;
+ extent_ = d.extent_ ? new Interval (*d.extent_) : 0;
+ return *this;
}
-Dimension_cache *
-Dimension_cache::common_refpoint (Dimension_cache const* s) const
+Dimension_cache::Dimension_cache ()
{
- Link_array<Dimension_cache> my_groups;
- for (Dimension_cache const *c = this; c ; c = c->parent_l_)
- my_groups.push ((Dimension_cache*)c);
-
- Dimension_cache const *common=0;
-
- for (Dimension_cache const * d = s; !common && d; d = d->parent_l_)
- common = (Dimension_cache const*)my_groups.find_l (d);
-
- return (Dimension_cache*) common;
+ init ();
}
-
-
void
-Dimension_cache::set_empty (bool b)
+Dimension_cache::init ()
{
- if (empty_b_ != b)
- {
- empty_b_ = b;
- if (!empty_b_)
- invalidate ();
- }
-}
+ offset_ = 0;
+ extent_ = 0;
+ parent_ = 0;
+}
-Interval
-Dimension_cache::get_dim () const
+Dimension_cache::~Dimension_cache ()
{
- Interval r;
- if (empty_b_)
- {
- r.set_empty ();
- return r;
- }
-
- if (!valid_b_)
- {
- Dimension_cache *nc = ((Dimension_cache*)this);
- nc->dim_= (*callback_l_ ) (nc);
- nc->valid_b_ = true;
- }
-
- r=dim_;
-
- return r;
+ clear ();
}
void
-Dimension_cache::set_callback (Dim_cache_callback c)
+Dimension_cache::clear ()
{
- callback_l_ =c;
+ delete extent_;
+ delete offset_;
+ extent_ = 0;
+ offset_ = 0;
}
-