listable.hh

00001 // This file is a part of Aurelia.
00002 // Copyright (C) 2010  Valentin David
00003 // Copyright (C) 2010  University of Bergen
00004 //
00005 // This program is free software: you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License as published by
00007 // the Free Software Foundation, either version 3 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // This program is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
00017 
00018 #ifndef __LISTABLE_HH
00019 # define __LISTABLE_HH
00020 
00021 # include "list_concept.hh"
00022 
00023 namespace aurelia {
00024 
00025   template <typename Model>
00026   struct listable_concept: public Model {
00027   public:
00028     typedef typename Model::type type;
00029   };
00030 
00031   template <typename T>
00032   struct listable_model {
00033     typedef void no_model;
00034   };
00035 
00036 }
00037 
00038 template <typename H, typename T,
00039           typename = typename aurelia::listable_model<H>::model,
00040           typename = typename aurelia::list_model<T>::model>
00041 aurelia::list_cons<H,T> operator,(const T& t, const H& h) {
00042   return aurelia::list_cons<H,T>(h, t);
00043 }
00044 
00045 template <typename H, typename T,
00046           typename = typename aurelia::listable_model<H>::model,
00047           typename = typename aurelia::listable_model<T>::model>
00048 aurelia::list_cons<H,aurelia::list_cons<T,aurelia::list_nil> >
00049 operator,(const T& t, const H& h) {
00050   return aurelia::list_cons<H,aurelia::list_cons<T,aurelia::list_nil> >
00051     (h, aurelia::list_cons<T,aurelia::list_nil>(t, aurelia::list_nil()));
00052 }
00053 
00054 #endif