/* Copyright 2015-2016 Amebis This file is part of ZRCola. ZRCola is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ZRCola is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with ZRCola. If not, see . */ #pragma once #include /// /// Public function calling convention /// #ifdef LIBZRCOLA #define ZRCOLA_API __declspec(dllexport) #else #define ZRCOLA_API __declspec(dllimport) #endif #define ZRCOLA_NOVTABLE __declspec(novtable) #pragma warning(push) #pragma warning(disable: 4251) #pragma warning(disable: 4512) /// /// Data records alignment /// #define ZRCOLA_RECORD_ALIGN 1 /// /// Database IDs /// #define ZRCOLA_DB_ID (*(ZRCola::recordid_t*)"ZRC") namespace ZRCola { typedef unsigned __int32 recordid_t; typedef unsigned __int32 recordsize_t; /// /// Memory index /// template class index : public std::vector { protected: std::vector &host; ///< Reference to host data public: /// /// Constructs the index /// /// \param[in] h Reference to vector holding the data /// index(_In_ std::vector &h) : host(h) {} /// /// Sorts index /// inline void sort() { qsort_s(data(), size(), sizeof(T_idx), compare_s, this); } /// /// Compares two elements /// /// \param[in] a Pointer to first element /// \param[in] b Pointer to second element /// /// \returns /// - <0 when a < b /// - =0 when a == b /// - >0 when a > b /// virtual int compare(_In_ const T &a, _In_ const T &b) const = 0; private: static int __cdecl compare_s(void *p, const void *a, const void *b) { const index *t = (const index*)p; return t->compare(t->host[*(const T_idx*)a], t->host[*(const T_idx*)b]); } }; /// /// Composed-decomposed index transformation mapping /// class ZRCOLA_NOVTABLE ZRCOLA_API mapping { public: size_t cmp; ///< Character index in composed string size_t decmp; ///< Character index in decomposed string inline mapping() {}; inline mapping(_In_ size_t c, _In_ size_t d) : cmp(c), decmp(d) {} }; /// /// A vector for composed-decomposed index transformation mapping /// class ZRCOLA_API mapping_vector : public std::vector { public: /// /// Transforms character index of decomposed to composed string /// /// \param[in] decmp Character index in decomposed string /// /// \returns Character index in composed string /// size_t to_composed(_In_ size_t decmp) const; /// /// Transforms destination index to source index /// /// \param[in] cmp Character index in composed string /// /// \returns Character index in decomposed string /// size_t to_decomposed(_In_ size_t cmp) const; }; }; #pragma warning(pop)