// @(#)root/hist:$Id$
// Author: Rene Brun   12/12/94

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TPolyMarker
#define ROOT_TPolyMarker


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TPolyMarker                                                          //
//                                                                      //
// An array of points with the same marker.                             //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#include "TObject.h"
#include "TAttMarker.h"
#include "TString.h"

class TCollection;

class TPolyMarker : public TObject, public TAttMarker {
protected:
   Int_t       fN{0};             ///< Number of points internally reserved (not necessarily used)
   Int_t       fLastPoint{-1};    ///< The index of the last filled point
   Double_t   *fX{nullptr};       ///<[fN] Array of X coordinates
   Double_t   *fY{nullptr};       ///<[fN] Array of Y coordinates
   TString     fOption;           ///< Options

   TPolyMarker& operator=(const TPolyMarker&);

public:
   TPolyMarker();
   TPolyMarker(Int_t n, Option_t *option="");
   TPolyMarker(Int_t n, Float_t *x, Float_t *y, Option_t *option="");
   TPolyMarker(Int_t n, Double_t *x, Double_t *y, Option_t *option="");
   TPolyMarker(const TPolyMarker &polymarker);
   ~TPolyMarker() override;
   void     Copy(TObject &polymarker) const override;
   Int_t    DistancetoPrimitive(Int_t px, Int_t py) override;
   void     Draw(Option_t *option="") override;
   virtual void     DrawPolyMarker(Int_t n, Double_t *x, Double_t *y, Option_t *option="");
   void     ExecuteEvent(Int_t event, Int_t px, Int_t py) override;
   /// \brief Get the index of the last filled point
   /// \note In case the TPolyMarker was filled in sequential order, the returned value + 1 matches
   /// the total number of points used (and is less or equal than the capacity GetN()).
   virtual Int_t    GetLastPoint() const { return fLastPoint;}
   /// \brief Get the current capacity (reserved size) of the TPolyMarker.
   /// \note In contrast to TGraph::GetN(), this does not necessarily match with the used points
   /// \warning Do not add points via SetPoint(pm->GetN(), x, y) as with a TGraph, use instead TPolyMarker::SetNextPoint
   /// \see GetLastPoint()
   virtual Int_t    GetN() const {return fN;}
   Option_t        *GetOption() const override {return fOption.Data();}
   Double_t        *GetX() const {return fX;}
   Double_t        *GetY() const {return fY;}
   void     ls(Option_t *option="") const override;
   virtual Int_t    Merge(TCollection *list);
   void     Paint(Option_t *option="") override;
   virtual void     PaintPolyMarker(Int_t n, Double_t *x, Double_t *y, Option_t *option="");
   void     Print(Option_t *option="") const override;
   void     SavePrimitive(std::ostream &out, Option_t *option = "") override;
   virtual Int_t    SetNextPoint(Double_t x, Double_t y); // *MENU*
   virtual void     SetPoint(Int_t point, Double_t x, Double_t y); // *MENU*
   virtual void     SetPolyMarker(Int_t n);
   virtual void     SetPolyMarker(Int_t n, Float_t *x, Float_t *y, Option_t *option="");
   virtual void     SetPolyMarker(Int_t n, Double_t *x, Double_t *y, Option_t *option="");
   virtual Int_t    Size() const {return fLastPoint+1;}

   ClassDefOverride(TPolyMarker,4)  //An array of points with the same marker
};

#endif
