//
// aegis - project change supervisor
// Copyright (C) 2002-2008, 2011, 2012 Peter Miller
// Copyright (C) 2007 Walter Franzini
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#include
#include
#include
#include
long
change_history_timestamp_to_delta(project *pp, time_t when)
{
trace(("%s\n{\n", __PRETTY_FUNCTION__));
cstate_ty *cstate_data;
cstate_branch_history_list_ty *hl;
change::pointer cp;
cp = pp->change_get();
cstate_data = cp->cstate_get();
if (!cstate_data->branch)
return 0;
hl = cstate_data->branch->history;
if (!hl)
return 0;
if (hl->length == 0)
return 0;
assert(hl->list);
if (!hl->list)
return 0;
//
// Find the right candidate using an algorithm with a logarithmic
// time complexity.
//
long start = 0;
long end = hl->length - 1;
cstate_branch_history_ty *bh_start = hl->list[start];
assert(bh_start);
time_t time_start =
pp->change_completion_timestamp(bh_start->change_number);
cstate_branch_history_ty *bh_end = hl->list[end];
assert(bh_end);
time_t time_end =
pp->change_completion_timestamp(bh_end->change_number);
//
// Find the right candidate using an algorithm with a logarithmic
// time complexity.
//
long result = 0;
for(;;)
{
assert (start <= end);
trace_long(start);
trace_long(end);
if (when == time_end)
{
assert(hl->list[end]);
result = hl->list[end]->delta_number;
break;
}
//
// This happend only at the 1st iteration if `when' is outside
// the interval.
//
if (when > time_end)
{
assert(hl->list[end]);
result = hl->list[end]->delta_number;
break;
}
if (when == time_start)
{
assert(hl->list[start]);
result = hl->list[start]->delta_number;
break;
}
//
// This happend only at the 1st iteration if `when' is outside
// the interval.
//
if (when < time_start)
{
result = 0;
break;
}
//
// If we cannot further reduce the interval and `when' is still
// missing we return the oldest change (pointed by start).
//
if (end - start == 1)
{
assert (time_end > when);
assert (when > time_start);
assert(hl->list[start]);
result = hl->list[start]->delta_number;
break;
}
long middle = start + (end - start) / 2;
cstate_branch_history_ty *bh_middle = hl->list[middle];
assert(bh_middle);
time_t time_middle =
pp->change_completion_timestamp(bh_middle->change_number);
if (when < time_middle)
{
time_end = time_middle;
end = middle;
}
else
{
time_start = time_middle;
start = middle;
}
}
return result;
}
// vim: set ts=8 sw=4 et :