123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- /*
- * Tencent is pleased to support the open source community by making wwsearch
- * available.
- *
- * Copyright (C) 2018-present Tencent. 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
- *
- * https://opensource.org/licenses/Apache-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 OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
- // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
- // This source code is licensed under both the GPLv2 (found in the
- // COPYING file in the root directory) and Apache 2.0 License
- // (found in the LICENSE.Apache file in the root directory).
- // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file. See the AUTHORS file for names of contributors.
- //
- // Slice is a simple structure containing a pointer into some external
- // storage and a size. The user of a Slice must ensure that the slice
- // is not used after the corresponding external storage has been
- // deallocated.
- //
- // Multiple threads can invoke const methods on a Slice without
- // external synchronization, but if any of the threads may call a
- // non-const method, all threads accessing the same Slice must use
- // external synchronization.
- #pragma once
- #include <assert.h>
- #include <stddef.h>
- #include <string.h>
- #include <cstdio>
- #include <string>
- #ifdef __cpp_lib_string_view
- #include <string_view>
- #endif
- // code copy from rocksdb/leveldb.
- namespace wwsearch {
- class Slice {
- public:
- // Create an empty slice.
- Slice() : data_(""), size_(0) {}
- // Create a slice that refers to d[0,n-1].
- Slice(const char* d, size_t n) : data_(d), size_(n) {}
- // Create a slice that refers to the contents of "s"
- /* implicit */
- Slice(const std::string& s) : data_(s.data()), size_(s.size()) {}
- #ifdef __cpp_lib_string_view
- // Create a slice that refers to the same contents as "sv"
- /* implicit */
- Slice(std::string_view sv) : data_(sv.data()), size_(sv.size()) {}
- #endif
- // Create a slice that refers to s[0,strlen(s)-1]
- /* implicit */
- Slice(const char* s) : data_(s) { size_ = (s == nullptr) ? 0 : strlen(s); }
- // Create a single slice from SliceParts using buf as storage.
- // buf must exist as long as the returned Slice exists.
- Slice(const struct SliceParts& parts, std::string* buf);
- // Return a pointer to the beginning of the referenced data
- const char* data() const { return data_; }
- // Return the length (in bytes) of the referenced data
- size_t size() const { return size_; }
- // Return true iff the length of the referenced data is zero
- bool empty() const { return size_ == 0; }
- // Return the ith byte in the referenced data.
- // REQUIRES: n < size()
- char operator[](size_t n) const {
- assert(n < size());
- return data_[n];
- }
- // Change this slice to refer to an empty array
- void clear() {
- data_ = "";
- size_ = 0;
- }
- // Drop the first "n" bytes from this slice.
- void remove_prefix(size_t n) {
- assert(n <= size());
- data_ += n;
- size_ -= n;
- }
- void remove_suffix(size_t n) {
- assert(n <= size());
- size_ -= n;
- }
- // Return a string that contains the copy of the referenced data.
- // when hex is true, returns a string of twice the length hex encoded (0-9A-F)
- std::string ToString(bool hex = false) const;
- #ifdef __cpp_lib_string_view
- // Return a string_view that references the same data as this slice.
- std::string_view ToStringView() const {
- return std::string_view(data_, size_);
- }
- #endif
- // Decodes the current slice interpreted as an hexadecimal string into result,
- // if successful returns true, if this isn't a valid hex string
- // (e.g not coming from Slice::ToString(true)) DecodeHex returns false.
- // This slice is expected to have an even number of 0-9A-F characters
- // also accepts lowercase (a-f)
- bool DecodeHex(std::string* result) const;
- // Three-way comparison. Returns value:
- // < 0 iff "*this" < "b",
- // == 0 iff "*this" == "b",
- // > 0 iff "*this" > "b"
- int compare(const Slice& b) const;
- // Return true iff "x" is a prefix of "*this"
- bool starts_with(const Slice& x) const {
- return ((size_ >= x.size_) && (memcmp(data_, x.data_, x.size_) == 0));
- }
- bool ends_with(const Slice& x) const {
- return ((size_ >= x.size_) &&
- (memcmp(data_ + size_ - x.size_, x.data_, x.size_) == 0));
- }
- // Compare two slices and returns the first byte where they differ
- size_t difference_offset(const Slice& b) const;
- // private: make these public for rockssearchjni access
- const char* data_;
- size_t size_;
- // Intentionally copyable
- };
- } // namespace wwsearch
|