metaSMT git

metaSMT/tags/Array.hpp

Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines