// 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_