mirror of
https://gitcode.com/gh_mirrors/ope/OpenFace.git
synced 2026-05-15 03:37:49 +00:00
247 lines
5.3 KiB
C++
247 lines
5.3 KiB
C++
// Copyright (C) 2007 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_SET_UTILs_
|
|
#define DLIB_SET_UTILs_
|
|
|
|
#include "../algs.h"
|
|
#include "set_utils_abstract.h"
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename T,
|
|
typename U
|
|
>
|
|
unsigned long set_intersection_size (
|
|
const T& a,
|
|
const U& b
|
|
)
|
|
{
|
|
if (is_same_object(a,b))
|
|
return a.size();
|
|
|
|
unsigned long num = 0;
|
|
|
|
if (a.size() < b.size())
|
|
{
|
|
a.reset();
|
|
while (a.move_next())
|
|
{
|
|
if (b.is_member(a.element()))
|
|
++num;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
b.reset();
|
|
while (b.move_next())
|
|
{
|
|
if (a.is_member(b.element()))
|
|
++num;
|
|
}
|
|
}
|
|
|
|
return num;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename T,
|
|
typename U,
|
|
typename V
|
|
>
|
|
void set_union (
|
|
const T& a,
|
|
const U& b,
|
|
V& u
|
|
)
|
|
{
|
|
typedef typename T::type type;
|
|
if (is_same_object(a,u) || is_same_object(b,u))
|
|
{
|
|
V local_u;
|
|
type temp;
|
|
a.reset();
|
|
while (a.move_next())
|
|
{
|
|
temp = a.element();
|
|
local_u.add(temp);
|
|
}
|
|
|
|
b.reset();
|
|
while (b.move_next())
|
|
{
|
|
if (a.is_member(b.element()) == false)
|
|
{
|
|
temp = b.element();
|
|
local_u.add(temp);
|
|
}
|
|
}
|
|
|
|
local_u.swap(u);
|
|
}
|
|
else
|
|
{
|
|
u.clear();
|
|
|
|
type temp;
|
|
a.reset();
|
|
while (a.move_next())
|
|
{
|
|
temp = a.element();
|
|
u.add(temp);
|
|
}
|
|
|
|
b.reset();
|
|
while (b.move_next())
|
|
{
|
|
if (a.is_member(b.element()) == false)
|
|
{
|
|
temp = b.element();
|
|
u.add(temp);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename T,
|
|
typename U,
|
|
typename V
|
|
>
|
|
void set_intersection (
|
|
const T& a,
|
|
const U& b,
|
|
V& i
|
|
)
|
|
{
|
|
typedef typename T::type type;
|
|
if (is_same_object(a,i) || is_same_object(b,i))
|
|
{
|
|
V local_i;
|
|
|
|
type temp;
|
|
|
|
if (a.size() < b.size())
|
|
{
|
|
a.reset();
|
|
while (a.move_next())
|
|
{
|
|
if (b.is_member(a.element()))
|
|
{
|
|
temp = a.element();
|
|
local_i.add(temp);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
b.reset();
|
|
while (b.move_next())
|
|
{
|
|
if (a.is_member(b.element()))
|
|
{
|
|
temp = b.element();
|
|
local_i.add(temp);
|
|
}
|
|
}
|
|
}
|
|
|
|
local_i.swap(i);
|
|
}
|
|
else
|
|
{
|
|
i.clear();
|
|
type temp;
|
|
|
|
if (a.size() < b.size())
|
|
{
|
|
a.reset();
|
|
while (a.move_next())
|
|
{
|
|
if (b.is_member(a.element()))
|
|
{
|
|
temp = a.element();
|
|
i.add(temp);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
b.reset();
|
|
while (b.move_next())
|
|
{
|
|
if (a.is_member(b.element()))
|
|
{
|
|
temp = b.element();
|
|
i.add(temp);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename T,
|
|
typename U,
|
|
typename V
|
|
>
|
|
void set_difference (
|
|
const T& a,
|
|
const U& b,
|
|
V& d
|
|
)
|
|
{
|
|
typedef typename T::type type;
|
|
if (is_same_object(a,d) || is_same_object(b,d))
|
|
{
|
|
V local_d;
|
|
|
|
type temp;
|
|
|
|
a.reset();
|
|
while (a.move_next())
|
|
{
|
|
if (b.is_member(a.element()) == false)
|
|
{
|
|
temp = a.element();
|
|
local_d.add(temp);
|
|
}
|
|
}
|
|
|
|
local_d.swap(d);
|
|
}
|
|
else
|
|
{
|
|
d.clear();
|
|
type temp;
|
|
|
|
a.reset();
|
|
while (a.move_next())
|
|
{
|
|
if (b.is_member(a.element()) == false)
|
|
{
|
|
temp = a.element();
|
|
d.add(temp);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_SET_UTILs_
|
|
|
|
|
|
|