pike.git / lib / modules / Calendar.pmod / TimeRanges.pmod

version» Context lines:

pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:1:   //! module Calendar    - // $Id: TimeRanges.pmod,v 1.26 2003/11/16 16:19:39 grubba Exp $ + // $Id: TimeRanges.pmod,v 1.27 2004/01/11 00:51:22 nilsson Exp $      #pike __REAL_VERSION__      #define zero int(0..0)      program SuperTimeRange=cSuperTimeRange;      string calendar_name() { return "TimeRanges"; }    - object calendar_object=this_object(); + object calendar_object=this;      string _sprintf(int t) { return (t=='O')?calendar_name():0; }      .Ruleset default_rules=Calendar.default_rules;      //------------------------------------------------------------------------   //! class TimeRange   //! This is the base class (usually implemented by e.g. Calendar   //! subclasses like Calendar.Second) for any time measurement and   //! calendrar information. It defines all the things you can do
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:112:    default:    if (objectp(args[0]) && args[0]->is_timerange)    {    convert_from([object(TimeRange)]args[0]);    return;    }    break;    }       error("%O.%O: Illegal parameters %O,%O,%O...\n", -  function_object(object_program(this_object())), -  object_program(this_object()), -  @args,0,0,0); +  function_object(this_program), +  this_program,@args,0,0,0);    }       static void convert_from(TimeRange other)    {   // inheriting class must take care of size    if (other->julian_day)    {    int|float jd=other->julian_day();    if (floatp(jd) && other->unix_time)    create("unix_r",other->unix_time(),other->ruleset());    else    create("julian_r",jd,other->ruleset());    }    else if (other->unix_time)    create("unix_r",other->unix_time(),other->ruleset());    else    error("Can't convert %O->%s.%O\n",other, -  calendar_name(), -  object_program(this_object())); +  calendar_name(), this_program);    }      //! method TimeRange set_size(TimeRange size)   //! method TimeRange set_size(int n,TimeRange size)   //! Gives back a new (or the same, if the size matches)   //! timerange with the new size.   //! If <i>n</i> are given, the resulting size   //! will be <i>n</i> amounts of the given size.   //! note:   //! A negative size is not permitted; a zero one are.
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:155:   // virtual    static TimeRange _set_size(int n,TimeRange x);       TimeRange set_size(function|TimeRange|int(0..0x7fffffff) a,    void|function|TimeRange b)    {    function|object(TimeRange) x;    int(0..0x7fffffff) n;    if (!b)    if (intp(a)) -  x=[function|object(TimeRange)]this_object(), -  n=[int(0..0x7fffffff)]a; +  x=this,n=[int(0..0x7fffffff)]a;    else    x=a,n=1;    else    x=b,n=a;    if (functionp(x)) x=promote_program(x);    if (n<0)    error("Negative size (%d)\n",n);    return _set_size(n,[object(TimeRange)]x);    }   
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:200:   // virtual    static this_program _add(int n,this_program step);       this_program add(function|this_program|int a,    void|function|this_program b)    {    function|object(this_program) x;    int n;    if (!b)    if (intp(a)) -  x=[function|object(this_program)]this_object(), -  n=[int]a; +  x=this,n=[int]a;    else    x=a,n=1;    else    x=b,n=a;    if (functionp(x)) x=promote_program(x);    return _add(n,[object(this_program)]x);    }      //! method TimeRange place(TimeRange this)   //! method TimeRange place(TimeRange this,int(0..1) force)
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:285:    }      //! method TimeRange next()   //! method TimeRange prev()   //! Next and prev are compatible and convinience functions;   //! <tt>a->next()</tt> is exactly the same as <tt>a+1</tt>;   //! <tt>a=a->next()</tt> is <tt>a++</tt>.       TimeRange next()    { -  return this_object()+1; +  return this+1;    }       TimeRange prev()    { -  return this_object()-1; +  return this-1;    }      //! method TimeRange `*(int n)   //! This changes the amount of time in   //! the time period. <tt>t*17</tt> is   //! the same as doing <tt>t-><ref>set_size</ref>(t,17)</tt>.       function ``* = `*;    TimeRange `*(int n)    { -  return set_size(n,this_object()); +  return set_size(n,this);    }      //! method array(TimeRange) `/(int n)   //! method array(TimeRange) split(int n)   //! This divides the called timerange into   //! n pieces. The returned timerange type   //! is not neccesarily of the same type as the called one.   //!   //! known bugs:   //! These are currently not defined for
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:409:   //!   //! This is true for suitable a and b:   //! <tt>a+a->offset_to(b)==b</tt>   //!   //! By suitable means that a and b are of the same   //! type and size. This is obviously true only   //! if a+n has b as a possible result for any n.       int offset_to(TimeRange x)    { -  if (x==this_object()) return 0; -  if (x<this_object()) -  return -(x->distance(this_object())/this_object()); -  return this_object()->distance(x)/this_object(); +  if (x==this) return 0; +  if (x<this) +  return -(x->distance(this)/this); +  return this->distance(x)/this;    }      //! method TimeRange beginning()   //! method TimeRange end()   //! This gives back the zero-sized beginning   //! or end of the called time period.   //!   //! rule:   //! <tt>range(t->beginning(),t->end())==t</tt>   
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:523:      //- internal method   //- returns [-1,0,1] for comparison between   //- (in order) begin/begin,begin/end,end/begin and end/end      // virtual, default    array(int(-1..1)) _compare(TimeRange what)    {    if (objectp(what) && what->is_supertimerange)    { -  array(int(-1..1)) cmp=what->_compare(this_object()); +  array(int(-1..1)) cmp=what->_compare(this);       return ({-cmp[0],    -cmp[2],    -cmp[1],    -cmp[3]});    }    return ({-1,-1,-1,-1});   // error("_compare: incompatible classes %O <-> %O\n", - // object_program(this_object()),object_program(what)); + // this_program,object_program(what));    }       string _describe_compare(array(int(-1..1)) c,TimeRange a,TimeRange b)    {    mapping desc=([-1:"<",0:"=",1:">"]);    return sprintf("%O start %s %O start\n"    "%O start %s %O end\n"    "%O end %s %O start\n"    "%O end %s %O end\n",    a,desc[c[0]],b,
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:675:   //!   //! The <tt>__hash</tt> method is also present,   //! to make timeranges possible to use as keys in mappings.   //!   //! known bugs:   //! _equal is not currently possible to overload,   //! due to weird bugs, so equal uses `== for now.       int(0..1) `==(TimeRange what)    { -  return object_program(what)==object_program(this_object()) && +  return object_program(what)==this_program &&    what->ruleset()==ruleset() &&    equals(what);    }       int __hash();      // int(0..1) _equal(TimeRange what)   // {   // return equals(what);   // }
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:708:    function ``& = `&;    TimeRange|zero `&(TimeRange with, mixed ...extra)    {    if (with->is_nulltimerange)    return with;    array(int(-1..1)) a=_compare(with);    if (a[END_BEGIN]<0 || a[BEGIN_END]>0)    return nulltimerange; // no overlap, no extra       if (with->is_supertimerange) -  return predef::`&(with,this_object(),@extra); // let it handle that... +  return predef::`&(with,this,@extra); // let it handle that...       TimeRange from,to;      // from the last beginning    if (a[BEGIN_BEGIN]>0) from=beginning(); else from=with->beginning();      // to the first end    if (a[END_END]<0) to=end(); else to=with->end();      // compute
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:738:   //! &gt;- the past the future -&lt;   //! |-------called-------|   //! |-------other--------|   //! &lt;----------union----------&gt;   //! </pre>       function ``| = `|;    TimeRange `|(TimeRange with,mixed ...extra)    {    if (with->is_nulltimerange) -  return sizeof(extra)?`|(@extra):this_object(); +  return sizeof(extra)?`|(@extra):this;    array(int(-1..1)) a=_compare(with);    TimeRange from,to;       if (a[END_BEGIN]<0 || a[BEGIN_END]>0) -  from=SuperTimeRange( sort(({this_object(),with})) ); // no overlap +  from=SuperTimeRange( sort(({this,with})) ); // no overlap    else    {    if (with->is_supertimerange) // let it handle that... -  return predef::`|(with,this_object(),@extra); +  return predef::`|(with,this,@extra);       // from the first beginning -  if (a[BEGIN_BEGIN]<0) from=this_object(); else from=with; +  if (a[BEGIN_BEGIN]<0) from=this; else from=with;       // to the last end -  if (a[END_END]>0) to=this_object(); else to=with; +  if (a[END_END]>0) to=this; else to=with;    // compute    from=from->range(to);    }    if (sizeof(extra)) return predef::`|(from,@extra);    return from;    }      //! method TimeRange `^(TimeRange with)   //! Gives the exclusive-or on the called time period   //! and another time period, ie the union without
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:777:   //! &gt;- the past the future -&lt;   //! |-------called-------|   //! |-------other--------|   //! &lt;----| |----> - exclusive or   //! </pre>       function ``^ = `^;    TimeRange `^(TimeRange with,mixed ... extra)    {    if (with->is_supertimerange) -  return `^(with,this_object(),@extra); // let it handle that... +  return `^(with,this,@extra); // let it handle that...    if (with->is_nulltimerange) -  return sizeof(extra)?`^(@extra):this_object(); +  return sizeof(extra)?`^(@extra):this;       TimeRange res;       array(int(-1..1)) a=_compare(with);    - // write(_describe_compare(a,this_object(),with)); + // write(_describe_compare(a,this,with));       TimeRange first,second;    if (a[END_BEGIN]<0 || a[BEGIN_END]>0) -  res=SuperTimeRange( sort(({this_object(),with})) ); // no overlap +  res=SuperTimeRange( sort(({this,with})) ); // no overlap    else if (a[BEGIN_END]==0 || a[END_BEGIN]==0) // bordering    if (a[BEGIN_BEGIN]<0)    res=range(with); // A precedes B    else -  res=with->range(this_object()); // B precedes A +  res=with->range(this); // B precedes A    else if (a[BEGIN_BEGIN]==0 && a[END_END]==0)    return sizeof(extra)?predef::`^(nulltimerange,@extra):nulltimerange;    else    {    // from the first beginning to the second beginning    if (a[BEGIN_BEGIN]<0)    first=distance(with);    else -  first=with->distance(this_object()); +  first=with->distance(this);      // and from the first end to the last end    if (a[END_END]<0)    second=end()->range(with);    else -  second=with->end()->range(this_object()); +  second=with->end()->range(this);    res=first|second;    }    // done    if (sizeof(extra)) return `^(res,@extra);    return res;    }      //! method TimeRange subtract(TimeRange what)   //! This subtracts a period of time from another;   //! <pre>
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:835:   //! |-------called-------|   //! |---third---|   //! &lt;----&gt; &lt;---> &lt;- called->subtract(third)   //! </pre>       TimeRange subtract(TimeRange what,mixed ... extra)    {    array(int(-1..1)) a=_compare(what);       if (a[END_BEGIN]<=0 || a[BEGIN_END]>=0) -  return sizeof(extra)?subtract(@extra):this_object(); // no overlap +  return sizeof(extra)?subtract(@extra):this; // no overlap       if (what->is_supertimerange)    {    array res=map(what->parts+extra,subtract)-({nulltimerange});    switch (sizeof(res))    {    case 0: return nulltimerange;    case 1: return res[0];    default: return predef::`&(@res);    }    }       TimeRange res;    - // write(_describe_compare(a,this_object(),what)); + // write(_describe_compare(a,this,what));       if (a[BEGIN_BEGIN]>=0) // it preceeds us    if (a[END_END]<=0)    return nulltimerange; // full overlap    else // half overlap at start -  res=what->end()->range(this_object()); +  res=what->end()->range(this);    else if (a[END_END]<=0) // it succeeds us    res=distance(what);    else    {   // werror("%O..\n..%O\n%O..\n..%O\n",   // beginning(),what->beginning(),   // what->end(),end());   // it's inside us    res=predef::`|(distance(what), -  what->end()->range(this_object())); +  what->end()->range(this));    }    if (sizeof(extra)) return res->subtract(@extra);    return res;    }      //! method TimeRange set_ruleset(Ruleset r)   //! method TimeRange ruleset(Ruleset r)   //! Set or get the current ruleset.   //! note:   //! this may include timezone shanges,
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:1043:    default: return SuperTimeRange(r);    }    }       TimeRange `|(TimeRange with,mixed ...extra)    {    TimeRange res;    if (with->is_supertimerange)    res=mend_overlap(sort(with->parts+parts));    else if (with->is_nulltimerange) -  return this_object(); +  return this;    else    res=mend_overlap(sort( ({with})+parts ));    if (sizeof(extra))    return predef::`|(res,@extra);    return res;    }       TimeRange subtract(TimeRange with,mixed ...extra)    {    array r=({});
pike.git/lib/modules/Calendar.pmod/TimeRanges.pmod:1177:       constant is_nulltimerange=1;      // overload    void create()    {    }       TimeRange set_size(TimeRange|int(0..0x7fffffff) a,void|TimeRange b)    { -  return this_object(); +  return this;    }       TimeRange place(TimeRange what,void|int force)    { -  return this_object(); +  return this;    }       array(TimeRange) split(int n)    { -  return allocate(n,this_object()); +  return allocate(n,this);    }    -  TimeRange beginning() { return this_object(); } -  TimeRange end() { return this_object(); } +  TimeRange beginning() { return this; } +  TimeRange end() { return this; }       TimeRange distance(TimeRange to)    { -  if (to==this_object()) return this_object(); +  if (to==this) return this;    error("Can't distance/space/range with the null timerange\n");    }       array(int(-1..1)) _compare(TimeRange with)    { -  if (with==this_object()) return ({0,0,0,0}); +  if (with==this) return ({0,0,0,0});    return ({-1,-1,-1,-1});    }       int(0..1) `<(TimeRange with)    { -  return !(with==this_object()); +  return !(with==this);    }       int(0..1) `>(TimeRange with)    {    return 0;    }       int(0..1) `==(TimeRange with)    {    return objectp(with) && with->is_nulltimerange;    }       int(0..1) equals(TimeRange with)    {    return objectp(with) && with->is_nulltimerange;    }       TimeRange `&(TimeRange with, mixed ...extra)    { -  return predef::`&(with,this_object(),@extra); +  return predef::`&(with,this,@extra);    }       TimeRange `|(TimeRange with, mixed ...extra)    { -  return predef::`|(with,this_object(),@extra); +  return predef::`|(with,this,@extra);    }       TimeRange `^(TimeRange with, mixed ...extra)    { -  return predef::`^(with,this_object(),@extra); +  return predef::`^(with,this,@extra);    }       this_program subtract(TimeRange with, mixed ...extra)    { -  return this_object(); +  return this;    }       int(1..1) `!()    {    return 1;    }       string _sprintf(int t,mapping m)    {    switch (t)