Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.61 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <cstdint>
  4. #include <iterator>
  5. #include <memory>
  6. #include <string>
  7. #include <type_traits>
  8. #include <variant>
  9. #include <vector>
  10.  
  11. #define NOMINMAX
  12. // %TwinCAT3DIR%\sdk\Include
  13. #include <Ads.h>
  14. namespace tcAdsAPI
  15. {
  16. // <TcAdsDef.h> defines many of the same types as <Ads.h> so we move these into another namespace,
  17. // functions in <TcAdsAPI.h> have external "C" linkange so linking is not affected
  18. #include <TcAdsDef.h>
  19. #include <TcAdsAPI.h>
  20. }
  21.  
  22. enum class adsDatatypeId : std::uint16_t
  23. {
  24.     void_ = VT_EMPTY,
  25.     int8_ = VT_I1,
  26.     uint8_ = VT_UI1,
  27.     int16_ = VT_I2,
  28.     uint16_ = VT_UI2,
  29.     int32_ = VT_I4,
  30.     uint32_ = VT_UI4,
  31.     int64_ = VT_I8,
  32.     uint64_ = VT_UI8,
  33.     float_ = VT_R4,
  34.     double_ = VT_R8,
  35.     cstring_ = VT_LPSTR,
  36.     wcstring_ = VT_LPWSTR,
  37.     ldouble_ = VT_LPWSTR + 1,
  38.     bool_ = 33,
  39.     blob_ = VT_BLOB,
  40. };
  41.  
  42. using ustring = std::basic_string<std::uint8_t>;
  43.  
  44. class adsVarData;
  45.  
  46. class adsData
  47. {
  48. public:
  49.     using sizeType = decltype(AdsSymbolEntry::entryLength);
  50.  
  51.     class symbolInfo;
  52.     class subSymbolInfo;
  53.     class datatypeInfo;
  54.     class arrayInfo;
  55.     using attributeInfo = std::pair<std::string, std::string>;
  56.     using enumVariant = std::variant<std::int8_t, std::uint8_t,
  57.                                      std::int16_t, std::uint16_t,
  58.                                      std::int32_t, std::uint32_t,
  59.                                      std::int64_t, std::uint64_t,
  60.                                      std::float_t, std::double_t,
  61.                                      bool, std::string>;
  62.     class enumInfo : public std::pair<std::string, enumVariant>
  63.     {
  64.     public:
  65.         using pair_type = std::pair<std::string, enumVariant>;
  66.         using pair_type::pair_type;
  67.         std::string valueToString() const;
  68.     };
  69.  
  70.     class iterator;
  71.     using const_iterator = iterator;
  72.  
  73.     explicit adsData(decltype(AmsAddr::port) port = AMSPORT_R0_PLC_RTS1);
  74.  
  75.     adsData(const adsData&) = delete;
  76.     adsData& operator=(const adsData&) = delete;
  77.  
  78.     adsData(adsData&&) noexcept;
  79.     adsData& operator=(adsData&&) noexcept;
  80.  
  81.     ~adsData() noexcept;
  82.  
  83.     adsVarData operator[](std::string_view name) const;
  84.  
  85.     iterator begin() const noexcept;
  86.     iterator end() const noexcept;
  87.     iterator cbegin() const noexcept;
  88.     iterator cend() const noexcept;
  89. private:
  90.     void initialize(const std::vector<char>& symData, const std::vector<char>& dtData);
  91.     std::vector<symbolInfo> symbols_;
  92.     std::vector<datatypeInfo> types_;
  93. };
  94.  
  95. class adsVarData
  96. {
  97. public:
  98.     using sizeType = adsData::sizeType;
  99.     class iterator;
  100.     using const_iterator = iterator;
  101.  
  102.     std::string        name(std::string prefix) const;
  103.     std::string        shortName() const;
  104.     const std::string& type() const noexcept;
  105.     const std::string& comment() const noexcept;
  106.     adsDatatypeId      typeId() const noexcept;
  107.     sizeType           group() const noexcept;
  108.     sizeType           offset() const noexcept;
  109.     sizeType           size() const noexcept;
  110.     bool               isStatic() const noexcept;
  111.     const GUID*        typeGuid() const noexcept;
  112.     const ustring&     copyMask() const noexcept;
  113.     const std::vector<adsData::attributeInfo>& attributes() const noexcept;
  114.     const std::vector<adsData::attributeInfo>& typeAttributes() const noexcept;
  115.     const std::vector<adsData::enumInfo>& typeEnums() const noexcept;
  116.  
  117.     bool isScalar() const noexcept;
  118.     bool isPointer() const noexcept;
  119.     bool isArray() const noexcept;
  120.     bool isStruct() const noexcept;
  121.     bool empty() const noexcept;
  122.  
  123.     sizeType subElements() const noexcept;
  124.  
  125.     iterator begin() const noexcept;
  126.     iterator end() const noexcept;
  127.     iterator cbegin() const noexcept;
  128.     iterator cend() const noexcept;
  129. private:
  130.     adsVarData(const adsData::subSymbolInfo* info, sizeType group, sizeType offset, sizeType index);
  131.     const adsData::subSymbolInfo* info_;
  132.     sizeType group_;
  133.     sizeType offset_;
  134.     sizeType index_;
  135.  
  136.     friend class adsData;
  137.     friend class adsData::iterator;
  138. };
  139.  
  140. class adsData::iterator
  141. {
  142. public:
  143.     using value_type = adsVarData;
  144.     using reference = adsVarData;
  145.     using pointer = adsVarData;
  146.     using difference_type = std::ptrdiff_t;
  147.     using iterator_category = std::input_iterator_tag;
  148.  
  149.     reference operator*() const noexcept;
  150.     pointer operator->() const noexcept;
  151.  
  152.     friend bool operator==(iterator lhs, iterator rhs) noexcept;
  153.     friend bool operator!=(iterator lhs, iterator rhs) noexcept;
  154.  
  155.     iterator& operator++() noexcept;
  156.     iterator operator++(int) noexcept;
  157. private:
  158.     explicit iterator(std::vector<adsData::symbolInfo>::const_iterator it) noexcept;
  159.     std::vector<adsData::symbolInfo>::const_iterator iter_;
  160.  
  161.     friend class adsData;
  162. };
  163.  
  164. class adsVarData::iterator
  165. {
  166. public:
  167.     using value_type = adsVarData;
  168.     using reference = adsVarData;
  169.     using pointer = adsVarData;
  170.     using difference_type = std::ptrdiff_t;
  171.     using iterator_category = std::input_iterator_tag;
  172.  
  173.     reference operator*() const noexcept;
  174.     pointer operator->() const noexcept;
  175.  
  176.     friend bool operator==(const iterator& lhs, const iterator& rhs) noexcept;
  177.     friend bool operator!=(const iterator& lhs, const iterator& rhs) noexcept;
  178.  
  179.     iterator& operator++() noexcept;
  180.     iterator operator++(int) noexcept;
  181. private:
  182.     explicit iterator(const adsData::subSymbolInfo* info, sizeType group, sizeType offset, sizeType index) noexcept;
  183.     const adsData::subSymbolInfo* info_;
  184.     sizeType group_;
  185.     sizeType offset_;
  186.     sizeType index_;
  187.  
  188.     friend class adsVarData;
  189. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement