text: #ifndef MN_MnCross_H_
  #define MN_MnCross_H_
  
  #include "Minuit/MnUserParameterState.h"
  
  class MnCross {
  
  public:
    
    class CrossParLimit {};
    class CrossFcnLimit {};
    class CrossNewMin {};
  
  public:
    
    MnCross() : theValue(0.), theState(MnUserParameterState()), theNFcn(0), theValid(false), theLimset(false), theMaxFcn(false), theNewMin(false) {} 
    
    MnCross(unsigned int nfcn) : theValue(0.), theState(MnUserParameterState() ), theNFcn(nfcn), theValid(false), theLimset(false), theMaxFcn(false), theNewMin(false) {} 
  
    MnCross(const  MnUserParameterState& state, unsigned int nfcn) : theValue(0.), theState(state), theNFcn(nfcn), theValid(false), theLimset(false), theMaxFcn(false), theNewMin(false) {} 
    
    MnCross(double value, const MnUserParameterState& state, unsigned int nfcn) : theValue(value), theState(state), theNFcn(nfcn), theValid(true), theLimset(false), theMaxFcn(false), theNewMin(false) {}
    
    MnCross(const MnUserParameterState& state, unsigned int nfcn, CrossParLimit) : theValue(0.), theState(state), theNFcn(nfcn), theValid(false), theLimset(true), theMaxFcn(false), theNewMin(false) {}
  
    MnCross(const MnUserParameterState& state, unsigned int nfcn, CrossFcnLimit) : theValue(0.), theState(state), theNFcn(nfcn), theValid(false), theLimset(false), theMaxFcn(true), theNewMin(false) {}
  
    MnCross(const MnUserParameterState& state, unsigned int nfcn, CrossNewMin) : theValue(0.), theState(state), theNFcn(nfcn), theValid(false), theLimset(false), theMaxFcn(false), theNewMin(true) {}
  
    ~MnCross() {}
  
    MnCross(const MnCross& cross) : theValue(cross.theValue), theState(cross.theState), theNFcn(cross.theNFcn), theValid(cross.theValid), theLimset(cross.theLimset), theMaxFcn(cross.theMaxFcn), theNewMin(cross.theNewMin) {}
  
    MnCross& operator()(const MnCross& cross) {
      theValue = cross.theValue;
      theState = cross.theState;
      theNFcn = cross.theNFcn;
      theValid = cross.theValid;
      theLimset = cross.theLimset;
      theMaxFcn = cross.theMaxFcn;
      theNewMin = cross.theNewMin;
      return *this;
    }
  
    double value() const {return theValue;}  
    const MnUserParameterState& state() const {return theState;}
    bool isValid() const {return theValid;}
    bool atLimit() const {return theLimset;}
    bool atMaxFcn() const {return theMaxFcn;}
    bool newMinimum() const {return theNewMin;}
    unsigned int nfcn() const {return theNFcn;}
  
  private:
  
    double theValue;
    MnUserParameterState theState;
    unsigned int theNFcn;
    bool theValid;
    bool theLimset;
    bool theMaxFcn;
    bool theNewMin;
  };
  
  #endif //MN_MnCross_H_
  