/* * Copyright (C) 2018 The Android Open Source Project * * 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. */ // Utility functions for working with FlatBuffers. #ifndef LIBTEXTCLASSIFIER_UTILS_FLATBUFFERS_FLATBUFFERS_H_ #define LIBTEXTCLASSIFIER_UTILS_FLATBUFFERS_FLATBUFFERS_H_ #include #include "annotator/model_generated.h" #include "flatbuffers/flatbuffers.h" namespace libtextclassifier3 { // Loads and interprets the buffer as 'FlatbufferMessage' and verifies its // integrity. template const FlatbufferMessage* LoadAndVerifyFlatbuffer(const void* buffer, int size) { const FlatbufferMessage* message = flatbuffers::GetRoot(buffer); if (message == nullptr) { return nullptr; } flatbuffers::Verifier verifier(reinterpret_cast(buffer), size); if (message->Verify(verifier)) { return message; } else { return nullptr; } } // Same as above but takes string. template const FlatbufferMessage* LoadAndVerifyFlatbuffer(const std::string& buffer) { return LoadAndVerifyFlatbuffer(buffer.c_str(), buffer.size()); } // Loads and interprets the buffer as 'FlatbufferMessage', verifies its // integrity and returns its mutable version. template std::unique_ptr LoadAndVerifyMutableFlatbuffer(const void* buffer, int size) { const FlatbufferMessage* message = LoadAndVerifyFlatbuffer(buffer, size); if (message == nullptr) { return nullptr; } return std::unique_ptr( message->UnPack()); } // Same as above but takes string. template std::unique_ptr LoadAndVerifyMutableFlatbuffer(const std::string& buffer) { return LoadAndVerifyMutableFlatbuffer(buffer.c_str(), buffer.size()); } template const char* FlatbufferFileIdentifier() { return nullptr; } template <> inline const char* FlatbufferFileIdentifier() { return ModelIdentifier(); } // Packs the mutable flatbuffer message to string. template std::string PackFlatbuffer( const typename FlatbufferMessage::NativeTableType* mutable_message) { flatbuffers::FlatBufferBuilder builder; builder.Finish(FlatbufferMessage::Pack(builder, mutable_message), FlatbufferFileIdentifier()); return std::string(reinterpret_cast(builder.GetBufferPointer()), builder.GetSize()); } // A convenience flatbuffer object with its underlying buffer. template class OwnedFlatbuffer { public: explicit OwnedFlatbuffer(B&& buffer) : buffer_(std::move(buffer)) {} // Cast as flatbuffer type. const T* get() const { return flatbuffers::GetRoot(buffer_.data()); } const B& buffer() const { return buffer_; } const T* operator->() const { return flatbuffers::GetRoot(buffer_.data()); } private: B buffer_; }; } // namespace libtextclassifier3 #endif // LIBTEXTCLASSIFIER_UTILS_FLATBUFFERS_FLATBUFFERS_H_