Advertisement
Guest User

Untitled

a guest
Apr 12th, 2018
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <cstdint>
  4. #include <iterator>
  5. #include <string>
  6. #include <vector>
  7.  
  8. #include "adsDataCursor.h"
  9.  
  10. using adsDataCursor::DatatypeId;
  11.  
  12. class AdsVarData;
  13.  
  14. class AdsData
  15. {
  16. public:
  17.     using SizeType = std::uint32_t;
  18.  
  19.     class SymbolInfo;
  20.     class SubSymbolInfo;
  21.     class DatatypeInfo;
  22.     class ArrayInfo;
  23.  
  24.     class iterator;
  25.     using const_iterator = iterator;
  26.  
  27.     AdsData() noexcept;
  28.     AdsData(const std::vector<char>& symData, const std::vector<char>& dtData);
  29.  
  30.     AdsData(const AdsData&) = delete;
  31.     AdsData& operator=(const AdsData&) = delete;
  32.  
  33.     AdsData(AdsData&&) noexcept;
  34.     AdsData& operator=(AdsData&&) noexcept;
  35.  
  36.     ~AdsData() noexcept;
  37.  
  38.     AdsVarData maybe(std::string_view name) const;
  39.     AdsVarData operator[](std::string_view name) const;
  40.  
  41.     iterator begin() const noexcept;
  42.     iterator end() const noexcept;
  43.     iterator cbegin() const noexcept;
  44.     iterator cend() const noexcept;
  45.  
  46. private:
  47.     std::vector<SymbolInfo>   symbols_;
  48.     std::vector<DatatypeInfo> types_;
  49. };
  50.  
  51. class AdsVarData
  52. {
  53. public:
  54.     using SizeType = AdsData::SizeType;
  55.     class iterator;
  56.     using const_iterator = iterator;
  57.  
  58.     std::string        name(std::string prefix) const;
  59.     std::string        shortName() const;
  60.     const std::string& type() const noexcept;
  61.     DatatypeId         typeId() const noexcept;
  62.     SizeType           group() const noexcept;
  63.     SizeType           offset() const noexcept;
  64.     SizeType           size() const noexcept;
  65.  
  66.     bool isPointer() const noexcept;
  67.     bool isReference() const noexcept;
  68.  
  69.     bool isStatic() const noexcept;
  70.  
  71.     bool empty() const noexcept;
  72.  
  73.     SizeType subElements() const noexcept;
  74.  
  75.     AdsVarData deref(SizeType address) const;
  76.  
  77.     AdsVarData maybe(std::string_view name) const;
  78.     AdsVarData operator[](std::string_view name) const;
  79.  
  80.     iterator begin() const noexcept;
  81.     iterator end() const noexcept;
  82.     iterator cbegin() const noexcept;
  83.     iterator cend() const noexcept;
  84.  
  85.     bool     good() const noexcept;
  86.     explicit operator bool() const noexcept;
  87.  
  88. private:
  89.     AdsVarData() noexcept;
  90.     AdsVarData(const AdsData::SubSymbolInfo* info, SizeType group, SizeType offset, SizeType index);
  91.     const AdsData::SubSymbolInfo* info_;
  92.     SizeType                      group_;
  93.     SizeType                      offset_;
  94.     SizeType                      index_;
  95.  
  96.     friend class AdsData;
  97.     friend class AdsData::iterator;
  98. };
  99.  
  100. class AdsData::iterator
  101. {
  102. public:
  103.     using value_type        = AdsVarData;
  104.     using reference         = AdsVarData;
  105.     using pointer           = AdsVarData;
  106.     using difference_type   = std::ptrdiff_t;
  107.     using iterator_category = std::input_iterator_tag;
  108.  
  109.     reference operator*() const noexcept;
  110.     pointer   operator->() const noexcept;
  111.  
  112.     friend bool operator==(iterator lhs, iterator rhs) noexcept;
  113.     friend bool operator!=(iterator lhs, iterator rhs) noexcept;
  114.  
  115.     iterator& operator++() noexcept;
  116.     iterator  operator++(int) noexcept;
  117.  
  118. private:
  119.     explicit iterator(std::vector<AdsData::SymbolInfo>::const_iterator it) noexcept;
  120.     std::vector<AdsData::SymbolInfo>::const_iterator iter_;
  121.  
  122.     friend class AdsData;
  123. };
  124.  
  125. class AdsVarData::iterator
  126. {
  127. public:
  128.     using value_type        = AdsVarData;
  129.     using reference         = AdsVarData;
  130.     using pointer           = AdsVarData;
  131.     using difference_type   = std::ptrdiff_t;
  132.     using iterator_category = std::input_iterator_tag;
  133.  
  134.     reference operator*() const noexcept;
  135.     pointer   operator->() const noexcept;
  136.  
  137.     friend bool operator==(const iterator& lhs, const iterator& rhs) noexcept;
  138.     friend bool operator!=(const iterator& lhs, const iterator& rhs) noexcept;
  139.  
  140.     iterator& operator++() noexcept;
  141.     iterator  operator++(int) noexcept;
  142.  
  143. private:
  144.     explicit iterator(const AdsData::SubSymbolInfo* info, SizeType group, SizeType offset, SizeType index) noexcept;
  145.     const AdsData::SubSymbolInfo* info_;
  146.     SizeType                      group_;
  147.     SizeType                      offset_;
  148.     SizeType                      index_;
  149.  
  150.     friend class AdsVarData;
  151. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement