180 lines
4.0 KiB
C++
180 lines
4.0 KiB
C++
// Copyright (C) 2010 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_SAMPLE_PaIR_Hh_
|
|
#define DLIB_SAMPLE_PaIR_Hh_
|
|
|
|
#include "sample_pair_abstract.h"
|
|
#include <limits>
|
|
#include "../serialize.h"
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
class sample_pair
|
|
{
|
|
public:
|
|
sample_pair(
|
|
) :
|
|
_index1(0),
|
|
_index2(0)
|
|
{
|
|
_distance = 1;
|
|
}
|
|
|
|
sample_pair (
|
|
const unsigned long idx1,
|
|
const unsigned long idx2
|
|
)
|
|
{
|
|
_distance = 1;
|
|
if (idx1 < idx2)
|
|
{
|
|
_index1 = idx1;
|
|
_index2 = idx2;
|
|
}
|
|
else
|
|
{
|
|
_index1 = idx2;
|
|
_index2 = idx1;
|
|
}
|
|
}
|
|
|
|
sample_pair (
|
|
const unsigned long idx1,
|
|
const unsigned long idx2,
|
|
const double dist
|
|
)
|
|
{
|
|
_distance = dist;
|
|
if (idx1 < idx2)
|
|
{
|
|
_index1 = idx1;
|
|
_index2 = idx2;
|
|
}
|
|
else
|
|
{
|
|
_index1 = idx2;
|
|
_index2 = idx1;
|
|
}
|
|
}
|
|
|
|
const unsigned long& index1 (
|
|
) const { return _index1; }
|
|
|
|
const unsigned long& index2 (
|
|
) const { return _index2; }
|
|
|
|
const double& distance (
|
|
) const { return _distance; }
|
|
|
|
private:
|
|
unsigned long _index1;
|
|
unsigned long _index2;
|
|
double _distance;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <typename T>
|
|
inline bool order_by_index (
|
|
const T& a,
|
|
const T& b
|
|
)
|
|
{
|
|
return a.index1() < b.index1() || (a.index1() == b.index1() && a.index2() < b.index2());
|
|
}
|
|
|
|
template <typename T>
|
|
inline bool order_by_distance (
|
|
const T& a,
|
|
const T& b
|
|
)
|
|
{
|
|
return a.distance() < b.distance();
|
|
}
|
|
|
|
template <typename T>
|
|
inline bool order_by_descending_distance (
|
|
const T& a,
|
|
const T& b
|
|
)
|
|
{
|
|
return a.distance() > b.distance();
|
|
}
|
|
|
|
template <typename T>
|
|
bool order_by_distance_and_index (
|
|
const T& a,
|
|
const T& b
|
|
)
|
|
{
|
|
return a.distance() < b.distance() || (a.distance() == b.distance() && order_by_index(a,b));
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
inline bool operator == (
|
|
const sample_pair& a,
|
|
const sample_pair& b
|
|
)
|
|
{
|
|
return a.index1() == b.index1() && a.index2() == b.index2();
|
|
}
|
|
|
|
inline bool operator != (
|
|
const sample_pair& a,
|
|
const sample_pair& b
|
|
)
|
|
{
|
|
return !(a == b);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
inline void serialize (
|
|
const sample_pair& item,
|
|
std::ostream& out
|
|
)
|
|
{
|
|
try
|
|
{
|
|
serialize(item.index1(),out);
|
|
serialize(item.index2(),out);
|
|
serialize(item.distance(),out);
|
|
}
|
|
catch (serialization_error& e)
|
|
{
|
|
throw serialization_error(e.info + "\n while serializing object of type sample_pair");
|
|
}
|
|
}
|
|
|
|
inline void deserialize (
|
|
sample_pair& item,
|
|
std::istream& in
|
|
)
|
|
{
|
|
try
|
|
{
|
|
unsigned long idx1, idx2;
|
|
double dist;
|
|
|
|
deserialize(idx1,in);
|
|
deserialize(idx2,in);
|
|
deserialize(dist,in);
|
|
item = sample_pair(idx1, idx2, dist);
|
|
}
|
|
catch (serialization_error& e)
|
|
{
|
|
throw serialization_error(e.info + "\n while deserializing object of type sample_pair");
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_SAMPLE_PaIR_Hh_
|
|
|