@@ -419,8 +419,19 @@ cdef class {{name}}HashTable(HashTable):
419419 return uniques.to_array()
420420
421421 def unique(self, const {{dtype}}_t[:] values, bint return_inverse=False):
422+ # define separate functions with/without inverse to force compilation
423+ # of the different code paths for boolean "return_inverse"
424+ if return_inverse:
425+ return self._unique_with_inverse(values)
426+ return self._unique_no_inverse(values)
427+
428+ def _unique_no_inverse(self, const {{dtype}}_t[:] values):
429+ return self._unique(values, uniques={{name}}Vector(), ignore_na=False,
430+ return_inverse=False)
431+
432+ def _unique_with_inverse(self, const {{dtype}}_t[:] values):
422433 return self._unique(values, uniques={{name}}Vector(), ignore_na=False,
423- return_inverse=return_inverse )
434+ return_inverse=True )
424435
425436 def factorize(self, {{dtype}}_t[:] values):
426437 return self._unique(values, uniques={{name}}Vector(), ignore_na=True,
@@ -685,8 +696,19 @@ cdef class StringHashTable(HashTable):
685696 return uniques.to_array()
686697
687698 def unique(self, ndarray[object] values, bint return_inverse=False):
699+ # define separate functions with/without inverse to force compilation
700+ # of the different code paths for boolean "return_inverse"
701+ if return_inverse:
702+ return self._unique_with_inverse(values)
703+ return self._unique_no_inverse(values)
704+
705+ def _unique_no_inverse(self, ndarray[object] values):
688706 return self._unique(values, uniques=ObjectVector(), ignore_na=False,
689- return_inverse=return_inverse)
707+ return_inverse=False)
708+
709+ def _unique_with_inverse(self, ndarray[object] values):
710+ return self._unique(values, uniques=ObjectVector(), ignore_na=False,
711+ return_inverse=True)
690712
691713 def factorize(self, ndarray[object] values):
692714 return self._unique(values, uniques=ObjectVector(), ignore_na=True,
@@ -831,8 +853,19 @@ cdef class PyObjectHashTable(HashTable):
831853 return uniques.to_array()
832854
833855 def unique(self, ndarray[object] values, bint return_inverse=False):
856+ # define separate functions with/without inverse to force compilation
857+ # of the different code paths for boolean "return_inverse"
858+ if return_inverse:
859+ return self._unique_with_inverse(values)
860+ return self._unique_no_inverse(values)
861+
862+ def _unique_no_inverse(self, ndarray[object] values):
834863 return self._unique(values, uniques=ObjectVector(), ignore_na=False,
835- return_inverse=return_inverse)
864+ return_inverse=False)
865+
866+ def _unique_with_inverse(self, ndarray[object] values):
867+ return self._unique(values, uniques=ObjectVector(), ignore_na=False,
868+ return_inverse=True)
836869
837870 def factorize(self, ndarray[object] values):
838871 return self._unique(values, uniques=ObjectVector(), ignore_na=True,
0 commit comments