// @(#)root/minuit2:$Id$
// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
 *                                                                    *
 **********************************************************************/

#ifndef ROOT_Minuit2_MnCross
#define ROOT_Minuit2_MnCross

#include "Minuit2/MnUserParameterState.h"

namespace ROOT {

   namespace Minuit2 {


class MnCross {

public:

  class CrossParLimit {};
  class CrossFcnLimit {};
  class CrossNewMin {};

public:

  MnCross() : fValue(0.), fState(MnUserParameterState()), fNFcn(0), fValid(false), fLimset(false), fMaxFcn(false), fNewMin(false) {}

  MnCross(unsigned int nfcn) : fValue(0.), fState(MnUserParameterState() ), fNFcn(nfcn), fValid(false), fLimset(false), fMaxFcn(false), fNewMin(false) {}

  MnCross(const  MnUserParameterState& state, unsigned int nfcn) : fValue(0.), fState(state), fNFcn(nfcn), fValid(false), fLimset(false), fMaxFcn(false), fNewMin(false) {}

  MnCross(double value, const MnUserParameterState& state, unsigned int nfcn) : fValue(value), fState(state), fNFcn(nfcn), fValid(true), fLimset(false), fMaxFcn(false), fNewMin(false) {}

  MnCross(const MnUserParameterState& state, unsigned int nfcn, CrossParLimit) : fValue(0.), fState(state), fNFcn(nfcn), fValid(true), fLimset(true), fMaxFcn(false), fNewMin(false) {}

  MnCross(const MnUserParameterState& state, unsigned int nfcn, CrossFcnLimit) : fValue(0.), fState(state), fNFcn(nfcn), fValid(false), fLimset(false), fMaxFcn(true), fNewMin(false) {}

  MnCross(const MnUserParameterState& state, unsigned int nfcn, CrossNewMin) : fValue(0.), fState(state), fNFcn(nfcn), fValid(false), fLimset(false), fMaxFcn(false), fNewMin(true) {}

  ~MnCross() {}

  MnCross(const MnCross& cross) : fValue(cross.fValue), fState(cross.fState), fNFcn(cross.fNFcn), fValid(cross.fValid), fLimset(cross.fLimset), fMaxFcn(cross.fMaxFcn), fNewMin(cross.fNewMin) {}

  MnCross& operator=(const MnCross&) = default;

  MnCross& operator()(const MnCross& cross) {
    fValue = cross.fValue;
    fState = cross.fState;
    fNFcn = cross.fNFcn;
    fValid = cross.fValid;
    fLimset = cross.fLimset;
    fMaxFcn = cross.fMaxFcn;
    fNewMin = cross.fNewMin;
    return *this;
  }

  double Value() const {return fValue;}
  const MnUserParameterState& State() const {return fState;}
  bool IsValid() const {return fValid;}
  bool AtLimit() const {return fLimset;}
  bool AtMaxFcn() const {return fMaxFcn;}
  bool NewMinimum() const {return fNewMin;}
  unsigned int NFcn() const {return fNFcn;}

private:

  double fValue;
  MnUserParameterState fState;
  unsigned int fNFcn;
  bool fValid;
  bool fLimset;
  bool fMaxFcn;
  bool fNewMin;
};

  }  // namespace Minuit2

}  // namespace ROOT

#endif  // ROOT_Minuit2_MnCross
