PageRenderTime 61ms CodeModel.GetById 52ms app.highlight 8ms RepoModel.GetById 0ms 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/******************************************************************************
 3* MODULE     : promise.hpp
 4* DESCRIPTION: promises
 5* COPYRIGHT  : (C) 2007  Joris van der Hoeven
 6*******************************************************************************
 7* This software falls under the GNU general public license version 3 or later.
 8* It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
 9* in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
10******************************************************************************/
11
12#ifndef PROMISE_H
13#define PROMISE_H
14#include "tree.hpp"
15
16class tree;
17template<class T> class promise_rep;
18template<class T> class promise;
19template<class T> tm_ostream& operator << (tm_ostream& out, promise<T> cmd);
20template<class T> bool is_nil (promise<T> l);
21
22template<class T>
23class promise_rep: public abstract_struct {
24public:
25  inline promise_rep () {}
26  inline virtual ~promise_rep () {}
27  inline virtual tm_ostream& print (tm_ostream& out);
28  virtual T eval () = 0;
29};
30
31template<class T>
32class promise {
33public:
34ABSTRACT_NULL_TEMPLATE(promise,T);
35  inline T operator () ();
36  friend tm_ostream& operator << LESSGTR (tm_ostream& out, promise<T> cmd);
37};
38ABSTRACT_NULL_TEMPLATE_CODE(promise,class,T);
39
40#define TMPL template<class T>
41TMPL inline tm_ostream& promise_rep<T>::print (tm_ostream& out) {
42  return out << "promise"; }
43TMPL inline T promise<T>::operator () () {
44  return rep->eval (); }
45TMPL inline bool operator == (promise<T> mw1, promise<T> mw2) {
46  return mw1.rep == mw2.rep; }
47TMPL inline tm_ostream& operator << (tm_ostream& out, promise<T> cmd) {
48  if (is_nil (cmd)) return out << "(null)"; else return cmd->print(out); }
49#undef TMPL
50
51#endif // defined PROMISE_H