diff mupdf-source/thirdparty/tesseract/src/ccutil/kdpair.h @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/tesseract/src/ccutil/kdpair.h	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,201 @@
+// Copyright 2012 Google Inc. All Rights Reserved.
+// Author: rays@google.com (Ray Smith)
+///////////////////////////////////////////////////////////////////////
+// File:        kdpair.h
+// Description: Template pair class like STL pair but geared towards
+//              the Key+Data design pattern in which some data needs
+//              to be sorted or kept in a heap sorted on some separate key.
+// Author:      Ray Smith.
+//
+// (C) Copyright 2012, Google Inc.
+// 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.
+//
+///////////////////////////////////////////////////////////////////////
+
+#ifndef TESSERACT_CCUTIL_KDPAIR_H_
+#define TESSERACT_CCUTIL_KDPAIR_H_
+
+#include <vector>
+
+namespace tesseract {
+
+// A useful base struct to facilitate the common operation of sorting a vector
+// of simple or smart-pointer data using a separate key. Similar to STL pair.
+template <typename Key, typename Data>
+struct KDPair {
+  KDPair() = default;
+  KDPair(Key k, Data d) : data_(d), key_(k) {}
+
+  int operator==(const KDPair<Key, Data> &other) const {
+    return key_ == other.key_;
+  }
+
+  Data &data() {
+    return data_;
+  }
+  const Data &data() const {
+    return data_;
+  }
+  Key &key() {
+    return key_;
+  }
+  const Key &key() const {
+    return key_;
+  }
+
+  // WARNING! Keep data as the first element! KDPairInc and KDPairDec depend
+  // on the order of these elements so they can downcast pointers appropriately
+  // for use by GenericHeap::Reshuffle.
+  Data data_;
+  Key key_;
+};
+// Specialization of KDPair to provide operator< for sorting in increasing order
+// and recasting of data pointers for use with DoublePtr.
+template <typename Key, typename Data>
+struct KDPairInc : public KDPair<Key, Data> {
+  KDPairInc() = default;
+  KDPairInc(Key k, Data d) : KDPair<Key, Data>(k, d) {}
+  // Operator< facilitates sorting in increasing order.
+  int operator<(const KDPairInc<Key, Data> &other) const {
+    return this->key() < other.key();
+  }
+  // Returns the input Data pointer recast to a KDPairInc pointer.
+  // Just casts a pointer to the first element to a pointer to the whole struct.
+  static KDPairInc *RecastDataPointer(Data *data_ptr) {
+    return reinterpret_cast<KDPairInc *>(data_ptr);
+  }
+};
+// Specialization of KDPair to provide operator< for sorting in decreasing order
+// and recasting of data pointers for use with DoublePtr.
+template <typename Key, typename Data>
+struct KDPairDec : public KDPair<Key, Data> {
+  KDPairDec() = default;
+  KDPairDec(Key k, Data d) : KDPair<Key, Data>(k, d) {}
+  // Operator< facilitates sorting in decreasing order by using operator> on
+  // the key values.
+  int operator<(const KDPairDec<Key, Data> &other) const {
+    return this->key() > other.key();
+  }
+  // Returns the input Data pointer recast to a KDPairDec pointer.
+  // Just casts a pointer to the first element to a pointer to the whole struct.
+  static KDPairDec *RecastDataPointer(Data *data_ptr) {
+    return reinterpret_cast<KDPairDec *>(data_ptr);
+  }
+};
+
+// A useful base class to facilitate the common operation of sorting a vector
+// of owned pointer data using a separate key. This class owns its data pointer,
+// deleting it when it has finished with it, and providing copy constructor and
+// operator= that have move semantics so that the data does not get copied and
+// only a single instance of KDPtrPair holds a specific data pointer.
+template <typename Key, typename Data>
+class KDPtrPair {
+public:
+  KDPtrPair() : data_(nullptr) {}
+  KDPtrPair(Key k, Data *d) : data_(d), key_(k) {}
+  // Copy constructor steals the pointer from src and nulls it in src, thereby
+  // moving the (single) ownership of the data.
+  KDPtrPair(const KDPtrPair &src) : data_(src.data_), key_(src.key_) {
+    ((KDPtrPair &)src).data_ = nullptr;
+  }
+  // Destructor deletes data, assuming it is the sole owner.
+  ~KDPtrPair() {
+    delete this->data_;
+    this->data_ = nullptr;
+  }
+  // Operator= steals the pointer from src and nulls it in src, thereby
+  // moving the (single) ownership of the data.
+  void operator=(const KDPtrPair &src) {
+    delete this->data_;
+    this->data_ = src.data_;
+    ((KDPtrPair &)src).data_ = nullptr;
+    this->key_ = src.key_;
+  }
+
+  int operator==(const KDPtrPair<Key, Data> &other) const {
+    return key_ == other.key_;
+  }
+
+  // Accessors.
+  const Key &key() const {
+    return key_;
+  }
+  void set_key(const Key &new_key) {
+    key_ = new_key;
+  }
+  const Data *data() const {
+    return data_;
+  }
+  // Sets the data pointer, taking ownership of the data.
+  void set_data(Data *new_data) {
+    delete data_;
+    data_ = new_data;
+  }
+  // Relinquishes ownership of the data pointer (setting it to nullptr).
+  Data *extract_data() {
+    Data *result = data_;
+    data_ = nullptr;
+    return result;
+  }
+
+private:
+  // Data members are private to keep deletion of data_ encapsulated.
+  Data *data_;
+  Key key_;
+};
+// Specialization of KDPtrPair to provide operator< for sorting in increasing
+// order.
+template <typename Key, typename Data>
+struct KDPtrPairInc : public KDPtrPair<Key, Data> {
+  // Since we are doing non-standard stuff we have to duplicate *all* the
+  // constructors and operator=.
+  KDPtrPairInc() : KDPtrPair<Key, Data>() {}
+  KDPtrPairInc(Key k, Data *d) : KDPtrPair<Key, Data>(k, d) {}
+  KDPtrPairInc(const KDPtrPairInc &src) : KDPtrPair<Key, Data>(src) {}
+  void operator=(const KDPtrPairInc &src) {
+    KDPtrPair<Key, Data>::operator=(src);
+  }
+  // Operator< facilitates sorting in increasing order.
+  int operator<(const KDPtrPairInc<Key, Data> &other) const {
+    return this->key() < other.key();
+  }
+};
+// Specialization of KDPtrPair to provide operator< for sorting in decreasing
+// order.
+template <typename Key, typename Data>
+struct KDPtrPairDec : public KDPtrPair<Key, Data> {
+  // Since we are doing non-standard stuff we have to duplicate *all* the
+  // constructors and operator=.
+  KDPtrPairDec() : KDPtrPair<Key, Data>() {}
+  KDPtrPairDec(Key k, Data *d) : KDPtrPair<Key, Data>(k, d) {}
+  KDPtrPairDec(const KDPtrPairDec &src) : KDPtrPair<Key, Data>(src) {}
+  void operator=(const KDPtrPairDec &src) {
+    KDPtrPair<Key, Data>::operator=(src);
+  }
+  // Operator< facilitates sorting in decreasing order by using operator> on
+  // the key values.
+  int operator<(const KDPtrPairDec<Key, Data> &other) const {
+    return this->key() > other.key();
+  }
+};
+
+// Specialization for a pair of ints in increasing order.
+using IntKDPair = KDPairInc<int, int>;
+
+// Vector of IntKDPair.
+class KDVector : public std::vector<IntKDPair> {
+  // TODO(rays) Add some code to manipulate a KDVector. For now there
+  // is nothing and this class is effectively a specialization typedef.
+};
+
+} // namespace tesseract
+
+#endif // TESSERACT_CCUTIL_KDPAIR_H_