PageRenderTime 115ms CodeModel.GetById 87ms RepoModel.GetById 1ms app.codeStats 0ms

/TeXmacs-1.0.7.11-src/src/Kernel/Containers/promise.hpp

#
C++ Header | 51 lines | 35 code | 7 blank | 9 comment | 4 complexity | 61210874287f028cbd1111aad3f93a2f MD5 | raw file
Possible License(s): GPL-3.0, GPL-2.0, MPL-2.0-no-copyleft-exception
  1. /******************************************************************************
  2. * MODULE : promise.hpp
  3. * DESCRIPTION: promises
  4. * COPYRIGHT : (C) 2007 Joris van der Hoeven
  5. *******************************************************************************
  6. * This software falls under the GNU general public license version 3 or later.
  7. * It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
  8. * in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
  9. ******************************************************************************/
  10. #ifndef PROMISE_H
  11. #define PROMISE_H
  12. #include "tree.hpp"
  13. class tree;
  14. template<class T> class promise_rep;
  15. template<class T> class promise;
  16. template<class T> tm_ostream& operator << (tm_ostream& out, promise<T> cmd);
  17. template<class T> bool is_nil (promise<T> l);
  18. template<class T>
  19. class promise_rep: public abstract_struct {
  20. public:
  21. inline promise_rep () {}
  22. inline virtual ~promise_rep () {}
  23. inline virtual tm_ostream& print (tm_ostream& out);
  24. virtual T eval () = 0;
  25. };
  26. template<class T>
  27. class promise {
  28. public:
  29. ABSTRACT_NULL_TEMPLATE(promise,T);
  30. inline T operator () ();
  31. friend tm_ostream& operator << LESSGTR (tm_ostream& out, promise<T> cmd);
  32. };
  33. ABSTRACT_NULL_TEMPLATE_CODE(promise,class,T);
  34. #define TMPL template<class T>
  35. TMPL inline tm_ostream& promise_rep<T>::print (tm_ostream& out) {
  36. return out << "promise"; }
  37. TMPL inline T promise<T>::operator () () {
  38. return rep->eval (); }
  39. TMPL inline bool operator == (promise<T> mw1, promise<T> mw2) {
  40. return mw1.rep == mw2.rep; }
  41. TMPL inline tm_ostream& operator << (tm_ostream& out, promise<T> cmd) {
  42. if (is_nil (cmd)) return out << "(null)"; else return cmd->print(out); }
  43. #undef TMPL
  44. #endif // defined PROMISE_H