metaSMT git
|
00001 #pragma once 00002 #ifndef HEADER_metaSMT_TAG_ARRAY_HPP 00003 #define HEADER_metaSMT_TAG_ARRAY_HPP 00004 00005 #include "Logic.hpp" 00006 00007 #include <boost/mpl/vector.hpp> 00008 #include <boost/variant.hpp> 00009 00010 namespace metaSMT { 00011 namespace logic { 00012 namespace Array { 00013 namespace tag { 00014 00015 #define PRINT(Tag, body) template<typename STREAM> \ 00016 friend STREAM & operator<< (STREAM & out, Tag const & self) \ 00017 { return (out << body); } 00018 #define TAG( NAME ) struct NAME##_tag { \ 00019 bool operator<(NAME##_tag const &) const { return false; } \ 00020 PRINT(NAME##_tag, #NAME) \ 00021 }; 00022 00023 // array variable tag 00024 struct array_var_tag { 00025 unsigned id; 00026 unsigned elem_width; 00027 unsigned index_width; 00028 PRINT(array_var_tag, "array_var_tag[" << self.id << ',' << self.elem_width << ',' << self.index_width << "]") 00029 bool operator< (array_var_tag const & other) const { 00030 return id < other.id; 00031 } 00032 }; 00033 00034 TAG(select) 00035 TAG(store) 00036 00037 #undef PRINT 00038 #undef TAG 00039 00040 typedef boost::mpl::vector< 00041 nil 00042 , select_tag 00043 , store_tag 00044 , array_var_tag 00045 >::type Array_Tags; 00046 00047 typedef boost::make_variant_over<Array_Tags>::type Array_Tag; 00048 00049 } // namespace metaSMT::logic::Array::tag 00050 } // namespace metaSMT::logic::Array 00051 } // namespace metaSMT::logic 00052 } // namespace metaSMT 00053 #endif // HEADER_metaSMT_TAG_ARRAY_HPP 00054 // vim: ft=cpp:ts=2:sw=2:expandtab