72 Object::createString<CalendarDouble>,
true);
76 setPythonValue, METH_KEYWORDS,
"update the value in a date range");
78 getEvents, METH_VARARGS,
"return an event iterator");
97 x.
addMethod(
"toXML",
toXML, METH_VARARGS,
"return a XML representation");
150 pElement >> defaultValue;
161 Bucket* tmp = firstBucket;
162 firstBucket = firstBucket->nextBucket;
169 if (l->getAvailable() ==
this)
170 l->setAvailable(NULL);
180 if (b->getMinimumCalendar()==
this) b->setMinimumCalendar(NULL);
181 if (b->getMaximumCalendar()==
this) b->setMaximumCalendar(NULL);
186 if (r->getMaximumCalendar()==
this) r->setMaximumCalendar(NULL);
195 return createNewBucket(end, start,
id);
197 return createNewBucket(start, end,
id);
205 while (b && b != bkt) b = b->nextBucket;
209 throw DataException(
"Trying to remove unavailable bucket from calendar '"
215 bkt->prevBucket->nextBucket = bkt->nextBucket;
218 firstBucket = bkt->nextBucket;
221 bkt->nextBucket->prevBucket = bkt->prevBucket;
232 throw DataException(
"Calendar bucket end must be later than its start");
243 throw DataException(
"Calendar bucket start must be earlier than its end");
261 nextBucket->startdate < startdate ||
262 (nextBucket->startdate == startdate && nextBucket->priority < priority)
266 if (nextBucket->nextBucket)
267 nextBucket->nextBucket->prevBucket =
this;
269 prevBucket->nextBucket = nextBucket;
271 cal->firstBucket = nextBucket;
272 nextBucket->prevBucket = prevBucket;
273 prevBucket = nextBucket;
275 nextBucket->nextBucket =
this;
279 else if (prevBucket && (
280 prevBucket->startdate > startdate ||
281 (prevBucket->startdate == startdate && prevBucket->priority > priority)
285 if (prevBucket->prevBucket)
286 prevBucket->prevBucket->nextBucket =
this;
288 nextBucket->prevBucket = prevBucket;
289 prevBucket->nextBucket = nextBucket;
290 nextBucket = prevBucket;
292 prevBucket->prevBucket =
this;
304 double curPriority = DBL_MAX;
305 long timeInWeek = INT_MIN;
306 for (
Bucket *b = firstBucket; b; b = b->nextBucket)
308 if (b->getStart() > d)
312 else if (curPriority > b->getPriority()
313 && ( (fwd && d >= b->getStart() && d < b->getEnd()) ||
314 (!fwd && d > b->getStart() && d <= b->getEnd())
317 if (!b->offsetcounter)
326 if (timeInWeek == INT_MIN)
329 timeInWeek = d.getSecondsWeek();
331 if (!fwd && timeInWeek == 0L) timeInWeek = 604800L;
334 for (
short i=0; i<b->offsetcounter; i+=2)
335 if ((fwd && timeInWeek >= b->offsets[i] && timeInWeek < b->offsets[i+1]) ||
336 (!fwd && timeInWeek > b->offsets[i] && timeInWeek <= b->offsets[i+1]))
352 for (
Bucket *b = firstBucket; b; b = b->nextBucket)
353 if (b->id == ident)
return b;
388 Date startdate = *d ? d->
getDate() : Date::infinitePast;
390 Date enddate = *d ? d->
getDate() : Date::infiniteFuture;
392 int id = *d ? d->
getInt() : INT_MIN;
398 switch (MetaClass::decodeAction(atts))
405 o <<
"Bucket " <<
id <<
" already exists in calendar '" <<
getName() <<
"'";
408 result =
addBucket(startdate, enddate,
id);
415 o <<
"Bucket " <<
id <<
" doesn't exist in calendar '" <<
getName() <<
"'";
424 o <<
"Bucket " <<
id <<
" doesn't exist in calendar '" <<
getName() <<
"'";
436 result =
addBucket(startdate, enddate,
id);
457 if (startdate != Date::infinitePast)
459 if (enddate != Date::infiniteFuture)
466 if (enddate != Date::infiniteFuture)
492 pElement >> priority;
494 setDays(pElement.
getInt());
506 throw LogicException(
"Generating calendar bucket without calendar");
508 if (ident == INT_MIN)
512 for (
BucketIterator i = cal->beginBuckets(); i != cal->endBuckets(); ++i)
513 if (i->id >= ident) ident = i->id + 1;
514 if (ident == INT_MIN) ident = 1;
523 for (
BucketIterator i = cal->beginBuckets(); i != cal->endBuckets(); ++i)
524 if (i->id == ident && &(*i) !=
this)
543 throw LogicException(
"Can't walk forward on event iterator of NULL calendar.");
547 curDate = Date::infiniteFuture;
548 for (
const Calendar::Bucket *b = theCalendar->firstBucket; b; b = b->nextBucket)
549 b->nextEvent(
this, d);
552 lastBucket = curBucket;
553 lastPriority = curPriority;
561 throw LogicException(
"Can't walk backward on event iterator of NULL calendar.");
565 curDate = Date::infinitePast;
566 for (
const Calendar::Bucket *b = theCalendar->firstBucket; b; b = b->nextBucket)
567 b->prevEvent(
this, d);
570 lastBucket = curBucket;
571 lastPriority = curPriority;
582 if (refDate < startdate && priority <= iter->lastPriority && (
583 startdate < iter->curDate ||
584 (startdate == iter->
curDate && priority <= iter->curPriority)
594 if (refDate < enddate && enddate <= iter->curDate && iter->
lastBucket ==
this)
609 bool allowEqualAtStart =
false;
610 if (refDate < startdate && (
611 startdate < iter->curDate ||
612 (startdate == iter->
curDate && priority <= iter->curPriority)
616 allowEqualAtStart =
true;
623 for (
short i=0; i<offsetcounter; i+=2)
630 bool canReturn =
true;
654 if ((refDate < st || (allowEqualAtStart && refDate == st)) && priority <= iter->lastPriority)
659 if (canReturn)
break;
666 if (canReturn)
return;
668 if (refDate < nd && iter->lastBucket ==
this)
673 if (canReturn)
break;
681 if (canReturn)
return;
687 DECLARE_EXPORT void Calendar::Bucket::prevEvent(EventIterator* iter,
Date refDate)
const
693 if (refDate > enddate && priority <= iter->lastPriority && (
694 enddate > iter->curDate ||
695 (enddate == iter->curDate && priority < iter->curPriority)
698 iter->curDate = enddate;
699 iter->curBucket =
this;
700 iter->curPriority = priority;
705 if (refDate > startdate && startdate > iter->curDate && iter->lastBucket ==
this)
707 iter->curDate = startdate;
708 iter->curBucket = iter->theCalendar->findBucket(startdate,
false);
709 iter->curPriority = iter->curBucket ? iter->curBucket->priority : INT_MAX;
720 bool allowEqualAtEnd =
false;
721 if (refDate > enddate && (
722 enddate > iter->curDate ||
723 (enddate == iter->curDate && priority < iter->curPriority)
727 allowEqualAtEnd =
true;
734 for (
short i=offsetcounter-1; i>=0; i-=2)
741 bool canReturn =
true;
765 if ((refDate > nd || (allowEqualAtEnd && refDate == nd))
766 && priority <= iter->lastPriority)
768 if (nd < iter->curDate || (nd == iter->curDate && priority <= iter->curPriority))
771 if (canReturn)
break;
776 iter->curBucket =
this;
777 if (canReturn)
return;
779 if (refDate > st && iter->lastBucket ==
this)
781 if (st < iter->curDate || (st == iter->curDate && priority <= iter->curPriority))
784 if (canReturn)
break;
790 iter->curBucket = iter->theCalendar->findBucket(st,
false);
791 iter->curPriority = iter->curBucket ? iter->curBucket->priority : INT_MAX;
792 if (canReturn)
return;
842 if (!cal)
throw LogicException(
"Can't set value of a NULL calendar");
845 PyObject *pystart, *pyend, *pyval;
846 if (!PyArg_ParseTuple(args,
"OOO:setValue", &pystart, &pyend, &pyval))
855 PythonType::evalException();
858 return Py_BuildValue(
"");
868 if (!cal)
throw LogicException(
"Can't set value of a NULL calendar");
872 if (!PyArg_ParseTuple(args,
"|i:addBucket", &
id))
877 if (!b) b = cal->
addBucket(Date::infinitePast, Date::infiniteFuture,
id);
885 PythonType::evalException();
888 return Py_BuildValue(
"");
896 x.
setName(
"calendarBucketIterator");
897 x.
setDoc(
"frePPLe iterator for calendar buckets");
905 if (i == cal->endBuckets())
return NULL;
906 PyObject *result = &*(i++);
921 return PythonObject(dynamic_cast< CalendarDouble::BucketDouble* >(
this)->getValue());
950 setPriority(field.
getInt());
960 dynamic_cast< CalendarDouble::BucketDouble* >(
this)->setValue(field.
getDouble());
974 PyObject*
self, PyObject* args
983 cal = static_cast<CalendarDouble*>(
self);
988 PyObject* pystart = NULL;
989 PyObject* pydirection = NULL;
990 if (!PyArg_ParseTuple(args,
"|OO:setvalue", &pystart, &pydirection))
1000 PythonType::evalException();
1010 x.
setName(
"calendarEventIterator");
1011 x.
setDoc(
"frePPLe iterator for calendar events");
1019 if ((forward && eventiter.getDate() == Date::infiniteFuture)
1020 || (!forward && eventiter.getDate() == Date::infinitePast))
1023 if (dynamic_cast<CalendarDouble*>(cal))
1025 if (eventiter.getBucket())
1026 x =
PythonObject(dynamic_cast<const CalendarDouble::BucketDouble*>(eventiter.getBucket())->getValue());
1028 x =
PythonObject(dynamic_cast<CalendarDouble*>(cal)->getDefault());
1033 PyObject* result = Py_BuildValue(
"(N,N)",
1034 static_cast<PyObject*>(
PythonObject(eventiter.getDate())),
1035 static_cast<PyObject*
>(x)
1047 if (days==127 && !starttime && endtime==
TimePeriod(86400L))
1056 for (
short i=0; i<=6; ++i)
1061 if (offsetcounter>=1 && (offsets[offsetcounter] == 86400*i + starttime))
1065 offsets[offsetcounter] = 86400*i + endtime;
1069 offsets[++offsetcounter] = 86400*i + starttime;
1070 offsets[++offsetcounter] = 86400*i + endtime;
1078 if (offsetcounter >= 1 && offsets[0]==0 && offsets[offsetcounter]==86400*7)
1080 offsets[0] = offsets[offsetcounter-1] - 86400*7;
1081 offsets[offsetcounter] = 86400*7 + offsets[1];