mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	
		
			
				
	
	
		
			117 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // This file is part of libigl, a simple c++ geometry processing library.
 | |
| // 
 | |
| // Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>
 | |
| // 
 | |
| // 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 <iostream>
 | |
| 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<class T> 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<class T> 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<class T> 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<class T> 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<class T> 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<cols;j++)
 | |
|       {
 | |
|         if(mat(a,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<class T> 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<cols;j++)
 | |
|       {
 | |
|         if(mat(a,j) !=  mat(b,j))
 | |
|         {
 | |
|           return false;
 | |
|         }
 | |
|       }
 | |
|       return true;
 | |
|     }
 | |
|     const T & mat;
 | |
|   };
 | |
| 
 | |
| }
 | |
| 
 | |
| #endif
 | 
