Listing 6
(a)
class Requisite
{
public:
int resource_type;
time_t range[2];
};
class Request
{
public:
std::list<Requisite> requisites;
int user_id;
int event_type;
};
int schedule(const Request &request, std::list<Reservation> &reservations);
(b)
template<class Src, class Dst>
class Error
{
public:
std::string description;
Handle source;
Chain<Src, Dst> chain;
};
(c)
try {
schedule(req, res);
} catch (Error<Request, int> &e) {
// ...
} catch (Error<Request, User> &e) {
// ...
} catch (Error<Request, time_t[2]> &e) {
// ...
}
(d)
template<class Src>
class Handle_Link : public Typed_Link<Src, Handle>
{
public:
Handle &traverse(Src &id)
{
static Handle h(id);
return h = Handle(id);
}
//...
};
template<class Src>
class Error_Base
{
public:
virtual Chain<Src,Handle> get_link(void) = 0;
std::string description;
Handle source;
// ...
};
template<class Src, class Dst>
class Error : public Error_Base<Src>
{
public:
Chain<Src,Handle> get_link(void)
{
return chain + Handle_Link<Dst>();
}
Chain<Src, Dst> chain;
// ...
};
(e)
...
} catch (Error_Base<Request> &e) {
Chain<Request, Handle> c = e.get_link();
if (c.get_distance(some_user) <
c.get_distance(some_requisite)) {
// smells like trouble in the requisite!
}
}