1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
// Copyright (c) 2017 GeometryFactory Sarl (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
//
// $URL: https://github.com/CGAL/cgal/blob/v6.1/Classification/include/CGAL/Classification/Feature_base.h $
// $Id: include/CGAL/Classification/Feature_base.h b26b07a1242 $
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Simon Giraudot
#ifndef CGAL_CLASSIFICATION_FEATURE_BASE_H
#define CGAL_CLASSIFICATION_FEATURE_BASE_H
#include <CGAL/license/Classification.h>
#include <memory>
#include <string>
#include <vector>
namespace CGAL {
namespace Classification {
/*!
\ingroup PkgClassificationFeature
\brief Abstract class describing a classification feature that
associates a scalar value to each item of the classification input.
*/
class Feature_base
{
std::string m_name;
public:
/// \cond SKIP_IN_MANUAL
Feature_base() : m_name ("abstract_feature") { }
virtual ~Feature_base() { }
/// \endcond
/*!
\brief returns the name of the feature (initialized to
`abstract_feature` for `Feature_base`).
*/
const std::string& name() const { return m_name; }
/*!
\brief changes the name of the feature.
*/
void set_name (const std::string& name) { m_name = name; }
/*!
\brief returns the value taken by the feature for at the item for
the item at position `index`. This method must be implemented by
inherited classes.
*/
virtual float value (std::size_t index) = 0;
};
#ifdef DOXYGEN_RUNNING
/*!
\ingroup PkgClassificationFeature
\brief %Handle to a `Feature_base`.
\cgalModels{Handle}
*/
class Feature_handle { };
#else
class Feature_set;
class Feature_handle
{
friend Feature_set;
using Feature_base_ptr = std::unique_ptr<Feature_base>;
std::shared_ptr<Feature_base_ptr> m_base;
template <typename Feature_ptr>
Feature_handle (Feature_ptr f)
: m_base (std::make_shared<Feature_base_ptr>(std::move(f)))
{
}
template <typename Feature_ptr>
void attach (Feature_ptr f)
{
*m_base = std::move(f);
}
public:
Feature_handle() : m_base (std::make_shared<Feature_base_ptr>()) { }
Feature_base& operator*() { return **m_base; }
Feature_base* operator->() { return m_base->get(); }
const Feature_base& operator*() const { return **m_base; }
const Feature_base* operator->() const { return m_base->get(); }
bool operator< (const Feature_handle& other) const { return *m_base < *(other.m_base); }
bool operator== (const Feature_handle& other) const { return *m_base == *(other.m_base); }
};
#endif
/*!
\ingroup PkgClassificationFeature
\brief casts a feature handle to a specialized feature pointer.
*/
template <typename FeatureType>
FeatureType* feature_cast (Feature_handle fh)
{
return dynamic_cast<FeatureType*>(&*(fh));
}
} // namespace Classification
} // namespace CGAL
#endif // CGAL_CLASSIFICATION_FEATURE_BASE_H
|