/* -*- mia-c++  -*-
 *
 * This file is part of MIA - a toolbox for medical image analysis
 * Copyright (c) Leipzig, Madrid 1999-2017 Gert Wollny
 *
 * MIA is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with MIA; if not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef mia_3d_landmarklist_hh
#define mia_3d_landmarklist_hh

#include <map>
#include <mia/core/iodata.hh>
#include <mia/3d/landmark.hh>

NS_MIA_BEGIN
/**
   @ingroup basic
   \brief A list of named landmarks

   This class implements a list of uniquely named landmarks.

 */

class EXPORT_3D C3DLandmarklist : public CIOData
{
       typedef std::map<std::string, P3DLandmark> CMap;
public:

       /// Type of the map values (needed for lambda arguments)
       typedef CMap::value_type value_type;

       /// read only iterator
       typedef CMap::const_iterator const_iterator;

       /// read-write iterator
       typedef CMap::iterator iterator;

       /**
          \cond INTERNAL
          \brief helper for plugin handling
        */
       static const char *data_descr;

       /// type helper for plugin handler
       typedef C3DLandmarklist type;
       /// @endcond

       typedef std::shared_ptr<C3DLandmarklist> Pointer;

       /**
          Add a Landmark to the list. If the landmark name already exists
          it is siletly overwritten.
          \param lm the landmark to be added
        */
       void add(P3DLandmark lm);


       /**
          \returns a dynamically created copy of the landmark list
        */
       C3DLandmarklist *clone() const;

       /**
          \returns the landmark with the giben name. If this landmark
          doesn't exist the function returns a (shared) null pointer.
        */
       P3DLandmark get(const std::string& name) const;

       /// \returns a read-only STL iterator to the landmarks
       const_iterator begin() const;
       /// \returns a read-only STL iterator to the landmarks
       const_iterator end() const;

       /// \returns a read-write STL iterator to the landmarks
       iterator begin();

       /// \returns a read-write STL iterator to the landmarks
       iterator end();

       /**
          Set the root path of the document (used to read the images)
          \param path
        */
       void set_path(const std::string& path);

       /**
          Set the name of the landmark list
          \param name
        */
       void set_name(const std::string& name);

       /**
          \returns the number of landmarks stored in the list
        */
       size_t size() const;

       /// \returns the name of the landmark list
       const std::string& get_name() const;
private:
       CMap m_list;

       std::string m_path;
       std::string m_name;
};


/// Pointer type for land mark list
typedef C3DLandmarklist::Pointer P3DLandmarklist;

NS_MIA_END
#endif

