metaSMT 2
metaSMT/tags/Logic.hpp
Go to the documentation of this file.
00001 #pragma once
00002 
00003 #include <boost/variant.hpp>
00004 #include <boost/mpl/vector.hpp>
00005 
00006 namespace metaSMT {
00007   struct nil { 
00008     bool operator< (nil const &) const { return false; };
00009     template<typename STREAM> friend STREAM & 
00010       operator<< (STREAM & out, nil const & ) {  out << "nil"; return out; }
00011   };
00012 
00013   namespace logic {
00014     namespace tag {
00015 
00016 #define PRINT(Tag, body) template<typename STREAM> \
00017   friend STREAM & operator<< (STREAM & out, Tag const & self) \
00018   {  out << body; return out; }
00019 #define TAG( NAME ) struct  NAME##_tag { \
00020   bool operator<(NAME##_tag const &) const {return false;} \
00021   PRINT(NAME##_tag, #NAME) \
00022 };
00023       
00024     // variable tag
00025     struct var_tag { unsigned id; 
00026       PRINT(var_tag, "var_tag[" << self.id  << "]")
00027       bool operator< (var_tag const & other) const {
00028         return id < other.id;
00029       }
00030     };
00031 
00032     // constants
00033     TAG(true)
00034     TAG(false)
00035 
00036     // unary
00037     TAG(not)
00038 
00039     // binary
00040     TAG(equal)
00041     TAG(nequal)
00042     TAG(implies)
00043 
00044     TAG(and)
00045     TAG(nand)
00046     TAG(or)
00047     TAG(nor)
00048     TAG(xor)
00049     TAG(xnor)
00050 
00051     TAG(ite)
00052 
00053 #undef PRINT
00054 #undef TAG
00055     //
00056       // tag variant Predicate
00057       typedef boost::mpl::vector<
00058           false_tag
00059         , true_tag
00060         , not_tag
00061         , equal_tag
00062         , nequal_tag
00063         , and_tag
00064         , nand_tag
00065         , or_tag
00066         , nor_tag
00067         , xor_tag
00068         , xnor_tag
00069         , implies_tag
00070         , ite_tag
00071         , var_tag
00072       >::type Predicate_Tags;
00073 
00074       typedef boost::make_variant_over< Predicate_Tags >::type Predicate_Tag;
00075 
00076     } // namespace tag
00077   } // namespace logic
00078 } // namespace metaSMT
00079 
00080 //  vim: ft=cpp:ts=2:sw=2:expandtab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines