Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.28 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iomanip>
  3. #include <iostream>
  4. #include <stdexcept>
  5. #include <string>
  6. #include <string_view>
  7. #include <utility>
  8. #include "adsData.h"
  9.  
  10. using namespace std::literals::string_view_literals;
  11.  
  12. std::ostream& operator<<(std::ostream& s, adsDatatypeId val) {
  13.     static constexpr std::pair<adsDatatypeId, std::string_view> typenames[] =
  14.     {
  15.         { adsDatatypeId::void_,     "void"sv },
  16.         { adsDatatypeId::int16_,    "int16"sv },
  17.         { adsDatatypeId::int32_,    "int32"sv },
  18.         { adsDatatypeId::float_,    "float"sv },
  19.         { adsDatatypeId::double_,   "double"sv },
  20.         { adsDatatypeId::int8_,     "int8"sv },
  21.         { adsDatatypeId::uint8_,    "uint8"sv },
  22.         { adsDatatypeId::uint16_,   "uint16"sv },
  23.         { adsDatatypeId::uint32_,   "uint32"sv },
  24.         { adsDatatypeId::int64_,    "int64"sv },
  25.         { adsDatatypeId::uint64_,   "uint64"sv },
  26.         { adsDatatypeId::cstring_,  "cstring"sv },
  27.         { adsDatatypeId::wcstring_, "wcstring"sv },
  28.         { adsDatatypeId::bool_,     "bool"sv },
  29.         { adsDatatypeId::blob_,     "blob"sv },
  30.     };
  31.     auto it = std::lower_bound(std::begin(typenames), std::end(typenames), val,
  32.         [](auto& x, auto& y) { return x.first < y; });
  33.     if (it == std::end(typenames) || it->first != val)
  34.         s << "unknown(" << static_cast<int>(val) << ')';
  35.     else
  36.         s << it->second << '(' << static_cast<int>(val) << ')';
  37.     return s;
  38. }
  39.  
  40. std::ostream& operator<<(std::ostream& s, const GUID& guid) {
  41.     return s << std::uppercase << std::hex << std::setfill('0')
  42.         << std::setw(8) << guid.Data1 << '-'
  43.         << std::setw(4) << guid.Data2 << '-'
  44.         << std::setw(4) << guid.Data3 << '-'
  45.         << std::setw(2) << static_cast<short>(guid.Data4[0])
  46.         << static_cast<short>(guid.Data4[1])
  47.         << '-' << static_cast<short>(guid.Data4[2])
  48.         << static_cast<short>(guid.Data4[3])
  49.         << static_cast<short>(guid.Data4[4])
  50.         << static_cast<short>(guid.Data4[5])
  51.         << static_cast<short>(guid.Data4[6])
  52.         << static_cast<short>(guid.Data4[7])
  53.         << std::nouppercase << std::dec;
  54. }
  55.  
  56. std::ostream& operator<<(std::ostream& s, const std::pair<std::string, std::string>& attr) {
  57.     return s << attr.first << ": " << attr.second;
  58. }
  59.  
  60. std::ostream& operator<<(std::ostream& s, const adsVarData& var) {
  61.     s << std::boolalpha
  62.         << "short: " << var.shortName() << '\n'
  63.         << "type: " << var.type() << '\n'
  64.         << "comment: " << var.comment() << '\n'
  65.         << "typeId: " << var.typeId() << '\n'
  66.         << "group: " << var.group() << '\n'
  67.         << "offset: " << var.offset() << '\n'
  68.         << "size: " << var.size() << '\n'
  69.         << "is pointer: " << var.isPointer() << '\n'
  70.         << "is static: " << var.isStatic() << '\n'
  71.         << "copy mask: ";
  72.     for (unsigned c : var.copyMask())
  73.         s << "0x" << std::setw(2) << std::hex << c << ',';
  74.     if (var.typeGuid())
  75.         s << "\ntype GUID: " << *var.typeGuid();
  76.     s << "\nattributes:\n";
  77.     for (auto& attr : var.attributes())
  78.         s << attr << '\n';
  79.     s << "type attributes:\n";
  80.     for (auto& attr : var.typeAttributes())
  81.         s << attr << '\n';
  82.     s << "type enums:\n";
  83.     for (auto& e : var.typeEnums())
  84.         s << e.first << ": " << e.valueToString() << '\n';
  85.     return s;
  86. }
  87.  
  88. void showSubs(const adsVarData& var, std::string prefix) {
  89.     for (auto&& sub : var) {
  90.         if (!sub.typeEnums().empty())
  91.             std::cout << "name: " << sub.name(prefix) << '\n' << sub << '\n';
  92.         showSubs(sub, sub.name(prefix));
  93.     }
  94. }
  95.  
  96. int main() {
  97.     std::string varNames[] =
  98.     {
  99.         "MAIN.myInt",
  100.     };
  101.     try
  102.     {
  103.         adsData plcData{};
  104.         for (auto&& var : plcData)
  105.         {
  106.             if (!var.typeEnums().empty())
  107.                 std::cout << var << '\n';
  108.             showSubs(var, var.shortName());
  109.         }
  110.         for (auto& name : varNames)
  111.         {
  112.             try
  113.             {
  114.                 std::cout << plcData[name] << '\n';
  115.             }
  116.             catch (std::out_of_range& e)
  117.             {
  118.                 std::cout << e.what() << '\n';
  119.             }
  120.         }
  121.     }
  122.     catch (std::runtime_error& e)
  123.     {
  124.         std::cout << e.what() << '\n';
  125.         return 1;
  126.     }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement