Guest User

Untitled

a guest
Mar 23rd, 2018
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.62 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.                                      bool, std::string>;
  61.     class enumInfo : public std::pair<std::string, enumVariant>
  62.     {
  63.     public:
  64.         using pair_type = std::pair<std::string, enumVariant>;
  65.         using pair_type::pair_type;
  66.         std::string valueToString() const;
  67.     };
  68.  
  69.     class iterator;
  70.     using const_iterator = iterator;
  71.  
  72.     adsData() noexcept;
  73.     explicit adsData(decltype(AmsAddr::port) port);
  74.     adsData(const std::vector<char>& symData, const std::vector<char>& dtData);
  75.  
  76.     adsData(const adsData&) = delete;
  77.     adsData& operator=(const adsData&) = delete;
  78.  
  79.     adsData(adsData&&) noexcept;
  80.     adsData& operator=(adsData&&) noexcept;
  81.  
  82.     ~adsData() noexcept;
  83.  
  84.     adsVarData operator[](std::string_view name) const;
  85.  
  86.     iterator begin() const noexcept;
  87.     iterator end() const noexcept;
  88.     iterator cbegin() const noexcept;
  89.     iterator cend() const noexcept;
  90. private:
  91.     void initialize(const std::vector<char>& symData, const std::vector<char>& dtData);
  92.     std::vector<symbolInfo> symbols_;
  93.     std::vector<datatypeInfo> types_;
  94. };
  95.  
  96. class adsVarData
  97. {
  98. public:
  99.     using sizeType = adsData::sizeType;
  100.     class iterator;
  101.     using const_iterator = iterator;
  102.  
  103.     std::string        name(std::string prefix) const;
  104.     std::string        shortName() const;
  105.     const std::string& type() const noexcept;
  106.     const std::string& comment() const noexcept;
  107.     adsDatatypeId      typeId() const noexcept;
  108.     sizeType           group() const noexcept;
  109.     sizeType           offset() const noexcept;
  110.     sizeType           size() const noexcept;
  111.     bool               isStatic() const noexcept;
  112.     const GUID*        typeGuid() const noexcept;
  113.     const ustring&     copyMask() const noexcept;
  114.     const std::vector<adsData::attributeInfo>& attributes() const noexcept;
  115.     const std::vector<adsData::attributeInfo>& typeAttributes() const noexcept;
  116.     const std::vector<adsData::enumInfo>& typeEnums() const noexcept;
  117.  
  118.     bool isScalar() const noexcept;
  119.     bool isPointer() const noexcept;
  120.     bool isArray() const noexcept;
  121.     bool isStruct() const noexcept;
  122.     bool empty() const noexcept;
  123.  
  124.     sizeType subElements() const noexcept;
  125.  
  126.     iterator begin() const noexcept;
  127.     iterator end() const noexcept;
  128.     iterator cbegin() const noexcept;
  129.     iterator cend() const noexcept;
  130. private:
  131.     adsVarData(const adsData::subSymbolInfo* info, sizeType group, sizeType offset, sizeType index);
  132.     const adsData::subSymbolInfo* info_;
  133.     sizeType group_;
  134.     sizeType offset_;
  135.     sizeType index_;
  136.  
  137.     friend class adsData;
  138.     friend class adsData::iterator;
  139. };
  140.  
  141. class adsData::iterator
  142. {
  143. public:
  144.     using value_type = adsVarData;
  145.     using reference = adsVarData;
  146.     using pointer = adsVarData;
  147.     using difference_type = std::ptrdiff_t;
  148.     using iterator_category = std::input_iterator_tag;
  149.  
  150.     reference operator*() const noexcept;
  151.     pointer operator->() const noexcept;
  152.  
  153.     friend bool operator==(iterator lhs, iterator rhs) noexcept;
  154.     friend bool operator!=(iterator lhs, iterator rhs) noexcept;
  155.  
  156.     iterator& operator++() noexcept;
  157.     iterator operator++(int) noexcept;
  158. private:
  159.     explicit iterator(std::vector<adsData::symbolInfo>::const_iterator it) noexcept;
  160.     std::vector<adsData::symbolInfo>::const_iterator iter_;
  161.  
  162.     friend class adsData;
  163. };
  164.  
  165. class adsVarData::iterator
  166. {
  167. public:
  168.     using value_type = adsVarData;
  169.     using reference = adsVarData;
  170.     using pointer = adsVarData;
  171.     using difference_type = std::ptrdiff_t;
  172.     using iterator_category = std::input_iterator_tag;
  173.  
  174.     reference operator*() const noexcept;
  175.     pointer operator->() const noexcept;
  176.  
  177.     friend bool operator==(const iterator& lhs, const iterator& rhs) noexcept;
  178.     friend bool operator!=(const iterator& lhs, const iterator& rhs) noexcept;
  179.  
  180.     iterator& operator++() noexcept;
  181.     iterator operator++(int) noexcept;
  182. private:
  183.     explicit iterator(const adsData::subSymbolInfo* info, sizeType group, sizeType offset, sizeType index) noexcept;
  184.     const adsData::subSymbolInfo* info_;
  185.     sizeType group_;
  186.     sizeType offset_;
  187.     sizeType index_;
  188.  
  189.     friend class adsVarData;
  190. };
Add Comment
Please, Sign In to add comment