void StorageAccess::accessCache(QString const & pCacheString, CacheMissCallback && pMiss, DataCallback && pHit) { QByteArray lData; if (fromCache(pCacheString, lData)) { pHit(lData); } else { pMiss([this, pCacheString, CAPTURE(pHit)] (QByteArray const& pData) { insertInCache(pCacheString, pData); pHit(pData); }); } }
Foam::pointHit Foam::tetrahedron<Point, PointRef>::containmentSphere ( const scalar tol ) const { // (Probably very inefficient) minimum containment sphere calculation. // From http://www.imr.sandia.gov/papers/imr11/shewchuk2.pdf: // Sphere ctr is smallest one of // - tet circumcentre // - triangle circumcentre // - edge mids const scalar fac = 1 + tol; // Halve order of tolerance for comparisons of sqr. const scalar facSqr = Foam::sqrt(fac); // 1. Circumcentre itself. pointHit pHit(circumCentre()); pHit.setHit(); scalar minRadiusSqr = magSqr(pHit.rawPoint() - a_); // 2. Try circumcentre of tet triangles. Create circumcircle for triFace and // check if 4th point is inside. { point ctr = triPointRef(a_, b_, c_).circumCentre(); scalar radiusSqr = magSqr(ctr - a_); if ( radiusSqr < minRadiusSqr && Foam::magSqr(d_-ctr) <= facSqr*radiusSqr ) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } { point ctr = triPointRef(a_, b_, d_).circumCentre(); scalar radiusSqr = magSqr(ctr - a_); if ( radiusSqr < minRadiusSqr && Foam::magSqr(c_-ctr) <= facSqr*radiusSqr ) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } { point ctr = triPointRef(a_, c_, d_).circumCentre(); scalar radiusSqr = magSqr(ctr - a_); if ( radiusSqr < minRadiusSqr && Foam::magSqr(b_-ctr) <= facSqr*radiusSqr ) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } { point ctr = triPointRef(b_, c_, d_).circumCentre(); scalar radiusSqr = magSqr(ctr - b_); if ( radiusSqr < minRadiusSqr && Foam::magSqr(a_-ctr) <= facSqr*radiusSqr ) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } // 3. Try midpoints of edges // mid of edge A-B { point ctr = 0.5*(a_ + b_); scalar radiusSqr = magSqr(a_ - ctr); scalar testRadSrq = facSqr*radiusSqr; if ( radiusSqr < minRadiusSqr && magSqr(c_-ctr) <= testRadSrq && magSqr(d_-ctr) <= testRadSrq) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } // mid of edge A-C { point ctr = 0.5*(a_ + c_); scalar radiusSqr = magSqr(a_ - ctr); scalar testRadSrq = facSqr*radiusSqr; if ( radiusSqr < minRadiusSqr && magSqr(b_-ctr) <= testRadSrq && magSqr(d_-ctr) <= testRadSrq ) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } // mid of edge A-D { point ctr = 0.5*(a_ + d_); scalar radiusSqr = magSqr(a_ - ctr); scalar testRadSrq = facSqr*radiusSqr; if ( radiusSqr < minRadiusSqr && magSqr(b_-ctr) <= testRadSrq && magSqr(c_-ctr) <= testRadSrq ) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } // mid of edge B-C { point ctr = 0.5*(b_ + c_); scalar radiusSqr = magSqr(b_ - ctr); scalar testRadSrq = facSqr*radiusSqr; if ( radiusSqr < minRadiusSqr && magSqr(a_-ctr) <= testRadSrq && magSqr(d_-ctr) <= testRadSrq ) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } // mid of edge B-D { point ctr = 0.5*(b_ + d_); scalar radiusSqr = magSqr(b_ - ctr); scalar testRadSrq = facSqr*radiusSqr; if ( radiusSqr < minRadiusSqr && magSqr(a_-ctr) <= testRadSrq && magSqr(c_-ctr) <= testRadSrq) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } // mid of edge C-D { point ctr = 0.5*(c_ + d_); scalar radiusSqr = magSqr(c_ - ctr); scalar testRadSrq = facSqr*radiusSqr; if ( radiusSqr < minRadiusSqr && magSqr(a_-ctr) <= testRadSrq && magSqr(b_-ctr) <= testRadSrq ) { pHit.setMiss(false); pHit.setPoint(ctr); minRadiusSqr = radiusSqr; } } pHit.setDistance(sqrt(minRadiusSqr)); return pHit; }
pHit Any::match_in_local(const char* buf, size_t len, bir roi) const { return (bitsize() <= roi.bitsize()) ? pHit(roi.low(), bitsize()) : pHit(); }