vector_view.h 3.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

#include <string>
#include <vector>
#include "flatbuffers/flatbuffers.h"
20
#include "lite/model_parser/base/vector_view.h"
21 22 23

namespace paddle {
namespace lite {
24
namespace vector_view {
25 26

template <typename T>
27
struct ElementTraits<T*,
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
                     typename std::enable_if<std::is_class<T>::value>::type> {
  typedef flatbuffers::Offset<T> element_type;
};

template <>
struct ElementTraits<std::string, void> {
  typedef flatbuffers::Offset<flatbuffers::String> element_type;
};

template <typename T>
struct VectorTraits<T, Flatbuffers> {
  typedef flatbuffers::Vector<typename ElementTraits<T>::element_type>
      vector_type;
  typedef typename vector_type::const_iterator const_iterator;
  typedef typename const_iterator::value_type value_type;
  typedef const typename const_iterator::reference const_reference;
  typedef value_type subscript_return_type;
};

struct FBSStrIterator {
  typedef flatbuffers::VectorIterator<
      flatbuffers::Offset<flatbuffers::String>,
      typename flatbuffers::IndirectHelper<
          flatbuffers::Offset<flatbuffers::String>>::return_type>
      VI;

54
  FBSStrIterator() = default;
55
  explicit FBSStrIterator(const VI& iter) { iter_ = iter; }
56
  const VI& raw_iter() const { return iter_; }
57 58

  bool operator==(const FBSStrIterator& other) const {
59
    return iter_ == other.raw_iter();
60 61 62
  }

  bool operator<(const FBSStrIterator& other) const {
63
    return iter_ < other.raw_iter();
64 65 66
  }

  bool operator!=(const FBSStrIterator& other) const {
67
    return iter_ != other.raw_iter();
68 69 70
  }

  ptrdiff_t operator-(const FBSStrIterator& other) const {
71
    return iter_ - other.raw_iter();
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
  }

  std::string operator*() const { return iter_.operator*()->str(); }
  std::string operator->() const { return iter_.operator->()->str(); }

  FBSStrIterator& operator++() {
    iter_++;
    return *this;
  }

  FBSStrIterator& operator--() {
    iter_--;
    return *this;
  }

  FBSStrIterator operator+(const size_t& offset) {
    return FBSStrIterator(iter_ + offset);
  }

  FBSStrIterator operator-(const size_t& offset) {
    return FBSStrIterator(iter_ - offset);
  }

 private:
  VI iter_;
};

99 100
}  // namespace vector_view

101 102 103
template <>
class VectorView<std::string, Flatbuffers> {
 public:
104
  typedef vector_view::VectorTraits<std::string, Flatbuffers> Traits;
105 106 107
  explicit VectorView(typename Traits::vector_type const* cvec) {
    cvec_ = cvec;
  }
108
  std::string operator[](size_t i) const { return cvec_->operator[](i)->str(); }
109
  vector_view::FBSStrIterator begin() const {
110 111 112
    if (!cvec_) {
      return vector_view::FBSStrIterator();
    }
113 114 115
    return vector_view::FBSStrIterator(cvec_->begin());
  }
  vector_view::FBSStrIterator end() const {
116 117 118
    if (!cvec_) {
      return vector_view::FBSStrIterator();
    }
119 120
    return vector_view::FBSStrIterator(cvec_->end());
  }
121
  size_t size() const {
122
    if (!cvec_) {
123 124 125 126
      return 0;
    }
    return cvec_->size();
  }
127
  operator std::vector<std::string>() const {
128
    VLOG(5) << "Copying elements out of VectorView will damage performance.";
129
    std::vector<std::string> tmp;
130
    tmp.reserve(size());
131 132
    for (size_t i = 0; i < size(); ++i) {
      tmp.push_back(cvec_->operator[](i)->str());
133 134 135
    }
    return tmp;
  }
136 137 138 139 140 141 142 143
  ~VectorView() = default;

 private:
  typename Traits::vector_type const* cvec_;
};

}  // namespace lite
}  // namespace paddle