vector_view.h 3.8 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 54
                     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;

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

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

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

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

  ptrdiff_t operator-(const FBSStrIterator& other) const {
70
    return iter_ - other.raw_iter();
71 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
  }

  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_;
};

98 99
}  // namespace vector_view

100 101 102
template <>
class VectorView<std::string, Flatbuffers> {
 public:
103
  typedef vector_view::VectorTraits<std::string, Flatbuffers> Traits;
104 105 106
  explicit VectorView(typename Traits::vector_type const* cvec) {
    cvec_ = cvec;
  }
107 108 109 110
  std::string operator[](size_t i) const {
    CHECK(cvec_);
    return cvec_->operator[](i)->str();
  }
111
  vector_view::FBSStrIterator begin() const {
112
    CHECK(cvec_);
113 114 115
    return vector_view::FBSStrIterator(cvec_->begin());
  }
  vector_view::FBSStrIterator end() const {
116
    CHECK(cvec_);
117 118
    return vector_view::FBSStrIterator(cvec_->end());
  }
119 120 121 122 123 124
  size_t size() const {
    if (cvec_ == nullptr) {
      return 0;
    }
    return cvec_->size();
  }
125
  operator std::vector<std::string>() const {
126
    VLOG(5) << "Copying elements out of VectorView will damage performance.";
127
    std::vector<std::string> tmp;
128 129 130 131 132
    tmp.reserve(size());
    if (cvec_ != nullptr) {
      for (auto val : *cvec_) {
        tmp.push_back(val->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