/** * Compute a <code>PreCompInfo</code> for a point on this curve, under a given name. Used by * <code>ECMultiplier</code>s to save the precomputation for this <code>ECPoint</code> for use * by subsequent multiplication. * * @param point * The <code>ECPoint</code> to store precomputations for. * @param name * A <code>String</code> used to index precomputations of different types. * @param callback * Called to calculate the <code>PreCompInfo</code>. */ public virtual PreCompInfo Precompute(ECPoint point, string name, IPreCompCallback callback) { CheckPoint(point); IDictionary table; lock (point) { table = point.m_preCompTable; if (null == table) { point.m_preCompTable = table = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable(4); } } lock (table) { PreCompInfo existing = (PreCompInfo)table[name]; PreCompInfo result = callback.Precompute(existing); if (result != existing) { table[name] = result; } return(result); } }
/** * Compute a <code>PreCompInfo</code> for a point on this curve, under a given name. Used by * <code>ECMultiplier</code>s to save the precomputation for this <code>ECPoint</code> for use * by subsequent multiplication. * * @param point * The <code>ECPoint</code> to store precomputations for. * @param name * A <code>String</code> used to index precomputations of different types. * @param callback * Called to calculate the <code>PreCompInfo</code>. */ public virtual PreCompInfo Precompute(ECPoint point, string name, IPreCompCallback callback) { CheckPoint(point); IDictionary table; lock (point) { table = point.m_preCompTable; if (null == table) { point.m_preCompTable = table = new Dictionary <object, object>(4); } } lock (table) { PreCompInfo existing = (PreCompInfo)table[name]; PreCompInfo result = callback.Precompute(existing); if (result != existing) { table[name] = result; } return(result); } }