keys_generator.cpp

Go to the documentation of this file.
00001 /*
00002  *
00003  *
00004  * Distributed under the OpenDDS License.
00005  * See: http://www.opendds.org/license.html
00006  */
00007 
00008 #include "keys_generator.h"
00009 #include "be_extern.h"
00010 
00011 #include "utl_identifier.h"
00012 
00013 #include <string>
00014 using std::string;
00015 
00016 bool keys_generator::gen_struct(AST_Structure*, UTL_ScopedName* name,
00017   const std::vector<AST_Field*>&, AST_Type::SIZE_TYPE, const char*)
00018 {
00019   string cxx = scoped(name), under = scoped_helper(name, "_");
00020   IDL_GlobalData::DCPS_Data_Type_Info* info = idl_global->is_dcps_type(name);
00021   if (!info) {
00022     return true;
00023   }
00024 
00025   const bool empty = info->key_list_.is_empty();
00026   {
00027     NamespaceGuard ng;
00028     Function has_key("gen_has_key", "bool");
00029     has_key.addArg("", "const " + cxx + "&");
00030     has_key.endArgs();
00031     be_global->impl_ << "  return " << (empty ? "false" : "true") << ";\n";
00032   }
00033 
00034   struct Namespaces {
00035     size_t n_;
00036     Namespaces(UTL_ScopedName* name)
00037       : n_(0)
00038     {
00039       for (UTL_ScopedName* sn = name; sn && sn->tail();
00040           sn = static_cast<UTL_ScopedName*>(sn->tail())) {
00041         string str = sn->head()->get_string();
00042         if (str.size()) {
00043           be_global->header_ << "namespace " << str << " {\n";
00044           ++n_;
00045         }
00046       }
00047     }
00048     ~Namespaces()
00049     {
00050       for (size_t i = 0; i < n_; ++i) be_global->header_ << "}\n";
00051     }
00052   } ns(name);
00053 
00054   be_global->header_ <<
00055     "namespace OpenDDSGenerated {\n"
00056     "// This structure supports use of std::map with a key\n"
00057     "// defined by one or more #pragma DCPS_DATA_KEY lines.\n"
00058     "struct " << be_global->export_macro() << ' ' <<
00059     name->last_component()->get_string() << "_KeyLessThan {\n"
00060     "  bool operator()(const " << cxx << "& v1, const " << cxx
00061     << "& v2) const\n"
00062     "  {\n"
00063     "    using ::operator<; // TAO::String_Manager's operator< is "
00064     "in global NS\n";
00065 
00066   if (empty) {
00067     be_global->header_ <<
00068       "    ACE_UNUSED_ARG(v1);\n"
00069       "    ACE_UNUSED_ARG(v2);\n"
00070       "    // with no DCPS_DATA_KEYs, return false\n"
00071       "    // to allow use of map with just one entry\n"
00072       "    return false;\n"
00073       "  }\n"
00074       "};\n"
00075       "}\n";
00076     return true;
00077   }
00078 
00079   IDL_GlobalData::DCPS_Data_Type_Info_Iter iter(info->key_list_);
00080 
00081   for (ACE_TString* kp = 0; iter.next(kp) != 0; iter.advance()) {
00082     string fname = ACE_TEXT_ALWAYS_CHAR(kp->c_str());
00083     be_global->header_ <<
00084       "    if (v1." << fname << " < v2." << fname << ") return true;\n"
00085       "    if (v2." << fname << " < v1." << fname << ") return false;\n";
00086   }
00087   be_global->header_ <<
00088     "    return false;\n"
00089     "  }\n};\n}\n";
00090   return true;
00091 }

Generated on Fri Feb 12 20:05:23 2016 for OpenDDS by  doxygen 1.4.7