void copy(const nearest_neighbour_dictionary& nnd) {
     // copy all members of the data structure
     m_abs_samples 	= 		nnd.m_abs_samples;
     m_differences 	= 		nnd.m_differences;
     m_ones 			= 		nnd.m_ones;
     m_size			= 		nnd.m_size;
     m_contains_abs_sample =	nnd.m_contains_abs_sample;
     m_rank_contains_abs_sample = nnd.m_rank_contains_abs_sample;
     m_rank_contains_abs_sample.set_vector(&m_contains_abs_sample);
 }
	//! Copy constructor
	nearest_neighbour_dictionary(const nearest_neighbour_dictionary& nnd)
		: m_abs_samples(nnd.m_abs_samples)
		, m_differences(nnd.m_differences)
		, m_ones(nnd.m_ones)
		, m_size(nnd.m_size)
		, m_contains_abs_sample(nnd.m_contains_abs_sample)
		, m_rank_contains_abs_sample(nnd.m_rank_contains_abs_sample)
	{
		m_rank_contains_abs_sample.set_vector(&m_contains_abs_sample);
	}
	void CEREAL_LOAD_FUNCTION_NAME(archive_t & ar)
	{
		ar(CEREAL_NVP(m_ones));
		ar(CEREAL_NVP(m_size));
		ar(CEREAL_NVP(m_abs_samples));
		ar(CEREAL_NVP(m_differences));
		ar(CEREAL_NVP(m_contains_abs_sample));
		ar(CEREAL_NVP(m_rank_contains_abs_sample));
		m_rank_contains_abs_sample.set_vector(&m_contains_abs_sample);
	}
	nearest_neighbour_dictionary& operator=(nearest_neighbour_dictionary&& nnd)
	{
		if (this != &nnd) {
			m_abs_samples			   = std::move(nnd.m_abs_samples);
			m_differences			   = std::move(nnd.m_differences);
			m_ones					   = std::move(nnd.m_ones);
			m_size					   = std::move(nnd.m_size);
			m_contains_abs_sample	  = std::move(nnd.m_contains_abs_sample);
			m_rank_contains_abs_sample = std::move(nnd.m_rank_contains_abs_sample);
			m_rank_contains_abs_sample.set_vector(&m_contains_abs_sample);
		}
		return *this;
	}