| // Copyright 2021 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ML_TEXT_SUGGESTIONS_H_ |
| #define ML_TEXT_SUGGESTIONS_H_ |
| |
| #include <base/no_destructor.h> |
| #include <base/optional.h> |
| #include <base/scoped_native_library.h> |
| #include <chromeos/libsuggest/text_suggester_interface.h> |
| |
| #include "chrome/knowledge/suggest/text_suggester_interface.pb.h" |
| #include "ml/util.h" |
| |
| namespace ml { |
| |
| // A singleton proxy class for the text suggestions DSO. |
| // Usage: |
| // auto* const instance = ml::TextSuggestions::GetInstance(); |
| // if (instance->GetStatus() == ml::TextSuggestions::Status::kOk) { |
| // instance->InitEnvironment(); |
| // // Generate suggestions here. |
| // TextSuggester const checker = instance->CreateTextSuggester(); |
| // ... |
| // } else { |
| // // Otherwise, use TextSuggestions::GetStatus() to get the error type. |
| // // Maybe return "not installed". |
| // ... |
| // } |
| |
| class TextSuggestions { |
| public: |
| enum class Status { |
| kOk = 0, |
| kUninitialized = 1, |
| kLoadLibraryFailed = 2, |
| kFunctionLookupFailed = 3, |
| kNotSupported = 4, |
| }; |
| |
| ~TextSuggestions(); |
| |
| static TextSuggestions* GetInstance(); |
| |
| // This returns a status specifying whether the library has been |
| // successfully initialized or not. |
| Status GetStatus() const; |
| |
| // Returns whether TextSuggestions are supported. |
| static constexpr bool IsTextSuggestionsSupported() { |
| return USE_ONDEVICE_TEXT_SUGGESTIONS && !IsAsan(); |
| } |
| |
| // Creates and returns a text suggester which is needed for using the other |
| // interfaces. The memory is owned by the user and should be deleted using |
| // `DestroyTextSuggester` after usage. |
| TextSuggester CreateTextSuggester() const; |
| |
| // Load the text suggester models. |
| // Returns true if TextSuggester is correctly loaded and initialized. |
| // Returns false otherwise. |
| bool LoadTextSuggester(TextSuggester suggester) const; |
| |
| // Sends the specified `request` to `suggester`. If the call is successful, |
| // `result` (which should not be null) is populated with the text suggester |
| // results. Returns true if the call succeeds, otherwise returns false. |
| bool GenerateSuggestions( |
| TextSuggester suggester, |
| const chrome_knowledge::TextSuggesterRequest& request, |
| chrome_knowledge::TextSuggesterResult* result) const; |
| |
| // Destroys a text suggester created by `CreateTextSuggester`. Must be |
| // called if the text suggester will not be used anymore, otherwise |
| // there will be memory leak. |
| void DestroyTextSuggester(TextSuggester suggester) const; |
| |
| private: |
| friend class base::NoDestructor<TextSuggestions>; |
| |
| // Initialize the text suggestions library |
| TextSuggestions(); |
| TextSuggestions(const TextSuggestions&) = delete; |
| TextSuggestions& operator=(const TextSuggestions&) = delete; |
| |
| base::Optional<base::ScopedNativeLibrary> library_; |
| Status status_; |
| |
| // Store the interface function pointers |
| CreateTextSuggesterFn create_text_suggester_; |
| LoadTextSuggesterFn load_text_suggester_; |
| SuggestCandidatesFn suggest_candidates_; |
| DeleteSuggestCandidatesResultDataFn delete_suggest_candidates_result_data_; |
| DestroyTextSuggesterFn destroy_text_suggester_; |
| }; |
| |
| } // namespace ml |
| |
| #endif // ML_TEXT_SUGGESTIONS_H_ |