/*
- * File: math_inset.C
- * Purpose: Implementation of insets for mathed
- * Author: Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
- * Created: January 1996
- * Description:
+ * File: math_atom.C
+ * Purpose: Wrapper for MathInset *
+ * Author: André Pönitz
+ * Created: July 2001
*
- * Dependencies: Xlib, XForms
+ * Copyright: 2001 The LyX team
*
- * Copyright: 1996, 1997 Alejandro Aguilar Sierra
- *
- * Version: 0.8beta.
+ * Version: 1.2.0
*
* You are free to use and modify this code under the terms of
* the GNU General Public Licence version 2 or later.
#include "math_inset.h"
#include "support/LAssert.h"
+#include <utility>
MathAtom::MathAtom()
: nucleus_(0)
MathAtom::MathAtom(MathAtom const & p)
-{
- copy(p);
-}
+ : nucleus_(p.nucleus_ ? p.nucleus_->clone() : 0)
+{}
void MathAtom::operator=(MathAtom const & p)
{
- if (this == &p)
+ if (&p == this)
return;
- done();
- copy(p);
+ MathAtom tmp(p);
+ std::swap(tmp.nucleus_, nucleus_);
}
MathAtom::~MathAtom()
{
- done();
+ delete nucleus_;
}
void MathAtom::reset(MathInset * p)
{
- done();
- nucleus_ = p;
-}
-
-
-
-void MathAtom::done()
-{
+ if (p == nucleus_)
+ return;
delete nucleus_;
-}
-
-
-void MathAtom::copy(MathAtom const & p)
-{
- //cerr << "calling MathAtom::copy\n";
- nucleus_ = p.nucleus_;
- if (nucleus_)
- nucleus_ = nucleus_->clone();
+ nucleus_ = p;
}
hackish. We use MathAtom only as a wrapper around MathInset * with value
semantics.
+The MathAtom owns the MathInset * and is responsible for proper cloning and
+destruction. Every MathInset * should be put into a MathAtom after its
+creation as soon as possible.
+
Andre'
*/
class MathAtom {
public:
- ///
+ /// default constructor, object is useless, but we need it to put it into
+ // std::containers
MathAtom();
- ///
- MathAtom(MathAtom const &);
- ///
+ /// the "real constructor"
explicit MathAtom(MathInset * p);
- ///
- virtual ~MathAtom();
- ///
+ /// copy constructor, invokes nucleus_->clone()
+ MathAtom(MathAtom const &);
+ /// we really need to clean up
+ ~MathAtom();
+ /// assignment invokes nucleus_->clone()
void operator=(MathAtom const &);
- ///
+ /// change inset under the hood
void reset(MathInset * p);
- ///
+ /// access to the inset
MathInset * nucleus() const;
- ///
+ /// access to the inset
MathInset * operator->() const;
private:
///
MathInset * nucleus_;
-
- /// raw copy
- void copy(MathAtom const & p);
- /// raw destruction
- void done();
};
#endif