1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00

??????: Fix error of TKernal and TMath compilation.

Error occured if using c++20 standard with new oneTBB 2021.5.0.
The error was:
   Error C2672 'tbb::v1::parallel_for_each': no matching overloaded function found TKernel
   could be 'void tbb::detail::d2::parallel_for_each(Iterator,Iterator,const Body &)' TKernel
   'tbb::detail::d2::parallel_for_each': the associated constraints are not satisfied TKernel
Note, that if we use c++14 or c++17, all ok, error does not occures.
To solve the problem, i have to modify `UniversalIterator` class:
`value_type` instead `UniversalIterator` converted to `IteratorInterface*`
`pointer` = `reference` = `value_type`
Method `DownCast` moved into `FunctorInterface` abstract class.
argument `UniversalIterator& item` of the unary fuctions converted to `IteratorInterface*`.
The proposed solution solved the compilation error.
This commit is contained in:
ddzama
2022-08-29 11:05:26 +03:00
parent 83cc25e05b
commit c0418c96db
2 changed files with 18 additions and 21 deletions

View File

@@ -125,10 +125,10 @@ protected:
// Since C++20 inheritance from std::iterator is deprecated, so define predefined types manually: // Since C++20 inheritance from std::iterator is deprecated, so define predefined types manually:
using iterator_category = std::forward_iterator_tag; using iterator_category = std::forward_iterator_tag;
using value_type = UniversalIterator; using value_type = IteratorInterface*;
using difference_type = ptrdiff_t; using difference_type = ptrdiff_t;
using pointer = UniversalIterator*; using pointer = value_type;
using reference = UniversalIterator&; using reference = value_type;
UniversalIterator() {} UniversalIterator() {}
@@ -171,18 +171,8 @@ protected:
return aValue; return aValue;
} }
const UniversalIterator& operator* () const { return *this; } const reference operator* () const { return myPtr.get(); }
UniversalIterator& operator* () { return *this; } reference operator* () { return myPtr.get(); }
const UniversalIterator* operator->() const { return this; }
UniversalIterator* operator->() { return this; }
// type cast to actual iterator
template <typename Iterator>
const Iterator& DownCast () const
{
return dynamic_cast<OSD_Parallel::IteratorWrapper<Iterator>*>(myPtr.get())->Value();
}
private: private:
std::unique_ptr<IteratorInterface> myPtr; std::unique_ptr<IteratorInterface> myPtr;
@@ -196,7 +186,14 @@ protected:
public: public:
virtual ~FunctorInterface() {} virtual ~FunctorInterface() {}
virtual void operator () (UniversalIterator& theIterator) const = 0; virtual void operator () (IteratorInterface* theIterator) const = 0;
// type cast to actual iterator
template <typename Iterator>
static const Iterator& DownCast(IteratorInterface* theIterator)
{
return dynamic_cast<OSD_Parallel::IteratorWrapper<Iterator>*>(theIterator)->Value();
}
}; };
private: private:
@@ -211,9 +208,9 @@ private:
{ {
} }
virtual void operator() (UniversalIterator& theIterator) const Standard_OVERRIDE virtual void operator() (IteratorInterface* theIterator) const Standard_OVERRIDE
{ {
const Iterator& anIt = theIterator.DownCast<Iterator>(); const Iterator& anIt = DownCast<Iterator>(theIterator);
myFunctor(*anIt); myFunctor(*anIt);
} }
@@ -233,9 +230,9 @@ private:
{ {
} }
virtual void operator() (UniversalIterator& theIterator) const Standard_OVERRIDE virtual void operator() (IteratorInterface* theIterator) const Standard_OVERRIDE
{ {
Standard_Integer anIndex = theIterator.DownCast<Standard_Integer>(); Standard_Integer anIndex = DownCast<Standard_Integer>(theIterator);
myFunctor(anIndex); myFunctor(anIndex);
} }

View File

@@ -100,7 +100,7 @@ namespace
{ {
for (OSD_Parallel::UniversalIterator anIter = myRange.It(); anIter != myRange.End(); anIter = myRange.It()) for (OSD_Parallel::UniversalIterator anIter = myRange.It(); anIter != myRange.End(); anIter = myRange.It())
{ {
myPerformer (anIter); myPerformer (*anIter);
} }
} }