// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2013 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #ifndef IGL_INDEXCOMPARISON_H #define IGL_INDEXCOMPARISON_H #include namespace igl{ // Comparison struct used by sort // http://bytes.com/topic/c/answers/132045-sort-get-index // For use with functions like std::sort template struct IndexLessThan { IndexLessThan(const T arr) : arr(arr) {} bool operator()(const size_t a, const size_t b) const { return arr[a] < arr[b]; } const T arr; }; // For use with functions like std::unique template struct IndexEquals { IndexEquals(const T arr) : arr(arr) {} bool operator()(const size_t a, const size_t b) const { return arr[a] == arr[b]; } const T arr; }; // For use with functions like std::sort template struct IndexVectorLessThan { IndexVectorLessThan(const T & vec) : vec ( vec) {} bool operator()(const size_t a, const size_t b) const { return vec(a) < vec(b); } const T & vec; }; // For use with functions like std::sort template struct IndexDimLessThan { IndexDimLessThan(const T & mat,const int & dim, const int & j) : mat(mat), dim(dim), j(j) {} bool operator()(const size_t a, const size_t b) const { if(dim == 1) { return mat(a,j) < mat(b,j); }else { return mat(j,a) < mat(j,b); } } const T & mat; const int & dim; const int & j; }; // For use with functions like std::sort template struct IndexRowLessThan { IndexRowLessThan(const T & mat) : mat ( mat) {} bool operator()(const size_t a, const size_t b) const { const int cols = mat.cols(); // Lexicographical order for(int j = 0;j mat(b,j)) { return false; } else if(mat(a,j) < mat(b,j)) { return true; } } // equality is false return false; } const T & mat; }; // For use with functions like std::sort template struct IndexRowEquals { IndexRowEquals(const T & mat) : mat ( mat) {} bool operator()(const size_t a, const size_t b) const { const int cols = mat.cols(); // Lexicographical order for(int j = 0;j