Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <cstdint>
- #include <iterator>
- #include <memory>
- #include <string>
- #include <type_traits>
- #include <variant>
- #include <vector>
- #define NOMINMAX
- // %TwinCAT3DIR%\sdk\Include
- #include <Ads.h>
- namespace tcAdsAPI
- {
- // <TcAdsDef.h> defines many of the same types as <Ads.h> so we move these into another namespace,
- // functions in <TcAdsAPI.h> have external "C" linkange so linking is not affected
- #include <TcAdsDef.h>
- #include <TcAdsAPI.h>
- }
- enum class adsDatatypeId : std::uint16_t
- {
- void_ = VT_EMPTY,
- int8_ = VT_I1,
- uint8_ = VT_UI1,
- int16_ = VT_I2,
- uint16_ = VT_UI2,
- int32_ = VT_I4,
- uint32_ = VT_UI4,
- int64_ = VT_I8,
- uint64_ = VT_UI8,
- float_ = VT_R4,
- double_ = VT_R8,
- cstring_ = VT_LPSTR,
- wcstring_ = VT_LPWSTR,
- ldouble_ = VT_LPWSTR + 1,
- bool_ = 33,
- blob_ = VT_BLOB,
- };
- using ustring = std::basic_string<std::uint8_t>;
- class adsVarData;
- class adsData
- {
- public:
- using sizeType = decltype(AdsSymbolEntry::entryLength);
- class symbolInfo;
- class subSymbolInfo;
- class datatypeInfo;
- class arrayInfo;
- using attributeInfo = std::pair<std::string, std::string>;
- using enumVariant = std::variant<std::int8_t, std::uint8_t,
- std::int16_t, std::uint16_t,
- std::int32_t, std::uint32_t,
- std::int64_t, std::uint64_t,
- bool, std::string>;
- class enumInfo : public std::pair<std::string, enumVariant>
- {
- public:
- using pair_type = std::pair<std::string, enumVariant>;
- using pair_type::pair_type;
- std::string valueToString() const;
- };
- class iterator;
- using const_iterator = iterator;
- adsData() noexcept;
- explicit adsData(decltype(AmsAddr::port) port);
- adsData(const std::vector<char>& symData, const std::vector<char>& dtData);
- adsData(const adsData&) = delete;
- adsData& operator=(const adsData&) = delete;
- adsData(adsData&&) noexcept;
- adsData& operator=(adsData&&) noexcept;
- ~adsData() noexcept;
- adsVarData operator[](std::string_view name) const;
- iterator begin() const noexcept;
- iterator end() const noexcept;
- iterator cbegin() const noexcept;
- iterator cend() const noexcept;
- private:
- void initialize(const std::vector<char>& symData, const std::vector<char>& dtData);
- std::vector<symbolInfo> symbols_;
- std::vector<datatypeInfo> types_;
- };
- class adsVarData
- {
- public:
- using sizeType = adsData::sizeType;
- class iterator;
- using const_iterator = iterator;
- std::string name(std::string prefix) const;
- std::string shortName() const;
- const std::string& type() const noexcept;
- const std::string& comment() const noexcept;
- adsDatatypeId typeId() const noexcept;
- sizeType group() const noexcept;
- sizeType offset() const noexcept;
- sizeType size() const noexcept;
- bool isStatic() const noexcept;
- const GUID* typeGuid() const noexcept;
- const ustring& copyMask() const noexcept;
- const std::vector<adsData::attributeInfo>& attributes() const noexcept;
- const std::vector<adsData::attributeInfo>& typeAttributes() const noexcept;
- const std::vector<adsData::enumInfo>& typeEnums() const noexcept;
- bool isScalar() const noexcept;
- bool isPointer() const noexcept;
- bool isArray() const noexcept;
- bool isStruct() const noexcept;
- bool empty() const noexcept;
- sizeType subElements() const noexcept;
- iterator begin() const noexcept;
- iterator end() const noexcept;
- iterator cbegin() const noexcept;
- iterator cend() const noexcept;
- private:
- adsVarData(const adsData::subSymbolInfo* info, sizeType group, sizeType offset, sizeType index);
- const adsData::subSymbolInfo* info_;
- sizeType group_;
- sizeType offset_;
- sizeType index_;
- friend class adsData;
- friend class adsData::iterator;
- };
- class adsData::iterator
- {
- public:
- using value_type = adsVarData;
- using reference = adsVarData;
- using pointer = adsVarData;
- using difference_type = std::ptrdiff_t;
- using iterator_category = std::input_iterator_tag;
- reference operator*() const noexcept;
- pointer operator->() const noexcept;
- friend bool operator==(iterator lhs, iterator rhs) noexcept;
- friend bool operator!=(iterator lhs, iterator rhs) noexcept;
- iterator& operator++() noexcept;
- iterator operator++(int) noexcept;
- private:
- explicit iterator(std::vector<adsData::symbolInfo>::const_iterator it) noexcept;
- std::vector<adsData::symbolInfo>::const_iterator iter_;
- friend class adsData;
- };
- class adsVarData::iterator
- {
- public:
- using value_type = adsVarData;
- using reference = adsVarData;
- using pointer = adsVarData;
- using difference_type = std::ptrdiff_t;
- using iterator_category = std::input_iterator_tag;
- reference operator*() const noexcept;
- pointer operator->() const noexcept;
- friend bool operator==(const iterator& lhs, const iterator& rhs) noexcept;
- friend bool operator!=(const iterator& lhs, const iterator& rhs) noexcept;
- iterator& operator++() noexcept;
- iterator operator++(int) noexcept;
- private:
- explicit iterator(const adsData::subSymbolInfo* info, sizeType group, sizeType offset, sizeType index) noexcept;
- const adsData::subSymbolInfo* info_;
- sizeType group_;
- sizeType offset_;
- sizeType index_;
- friend class adsVarData;
- };
Add Comment
Please, Sign In to add comment