// -*- C++ -*-
/**
 * \file math_atom.h
 * This file is part of LyX, the document processor.
 * Licence details can be found in the file COPYING.
 *
 * \author André Pönitz
 *
 * Full author contact details are available in file CREDITS.
 */

#ifndef MATH_ATOM_H
#define MATH_ATOM_H


/**
Wrapper for MathInset * with copy-semantics

--

The 'atom' is the major blob in math typesetting.  And 'atom' consists
of a nucleus, an optional superscript, and an optional subscript.

Exactly where the subscript and superscript are drawn depends on the
size, and type, of the nucleus they are attached to.

Jules

--

Ok: Implementing it thusly is not feasible since cursor movement gets
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 InsetBase;
class MathInset;

class MathAtom {
public:
	/// default constructor, object is useless, but we need it to put it into
	// std::containers
	MathAtom();
	/// the "real constructor"
	explicit MathAtom(InsetBase * p);
	/// copy constructor, invokes nucleus_->clone()
	MathAtom(MathAtom const &);
	/// we really need to clean up
	~MathAtom();
	/// assignment invokes nucleus_->clone()
	MathAtom & operator=(MathAtom const &);
	/// access to the inset (checked with gprof)
	MathInset       * nucleus()       { return nucleus_; }
	MathInset const * nucleus() const { return nucleus_; }
	/// access to the inset
	MathInset const * operator->() const { return nucleus_; }

	/// width cache. Not nice...
	//mutable int width_;

private:
	///
	MathInset * nucleus_;
};

#endif
