GEN gcdii(GEN a, GEN b) { long v, w; pari_sp av; GEN t; switch (absi_cmp(a,b)) { case 0: return absi(a); case -1: swap(a,b); } if (!signe(b)) return absi(a); /* here |a|>|b|>0. Try single precision first */ if (lgefint(a)==3) return igcduu((ulong)a[2], (ulong)b[2]); if (lgefint(b)==3) { ulong u = resiu(a,(ulong)b[2]); if (!u) return absi(b); return igcduu((ulong)b[2], u); } /* larger than gcd: "avma=av" gerepile (erasing t) is valid */ av = avma; (void)new_chunk(lgefint(b)+1); /* HACK */ t = remii(a,b); if (!signe(t)) { avma=av; return absi(b); } a = b; b = t; v = vali(a); a = shifti(a,-v); setabssign(a); w = vali(b); b = shifti(b,-w); setabssign(b); if (w < v) v = w; switch(absi_cmp(a,b)) { case 0: avma=av; a=shifti(a,v); return a; case -1: swap(a,b); } if (is_pm1(b)) { avma=av; return int2n(v); } { /* general case */ /*This serve two purposes: 1) mpn_gcd destroy its input and need an extra * limb 2) this allows us to use icopy instead of gerepile later. NOTE: we * must put u before d else the final icopy could fail. */ GEN res= cgeti(lgefint(a)+1); GEN ca = icopy_ef(a,lgefint(a)+1); GEN cb = icopy_ef(b,lgefint(b)+1); long l = mpn_gcd(LIMBS(res), LIMBS(ca), NLIMBS(ca), LIMBS(cb), NLIMBS(cb)); res[1] = evalsigne(1)|evallgefint(l+2); avma=av; return shifti(res,v); } }
void testArrayPropHashes() { std::string archiveName = "arrayHashTest.abc"; { AO::WriteArchive w; ABCA::ArchiveWriterPtr a = w(archiveName, ABCA::MetaData()); ABCA::ObjectWriterPtr archive = a->getTop(); ABCA::ObjectWriterPtr child; // add a time sampling for later use std::vector < double > timeSamps(1,-4.0); ABCA::TimeSamplingType tst(3.0); ABCA::TimeSampling ts(tst, timeSamps); a->addTimeSampling(ts); // 2 objects without any properties whatsoever archive->createChild(ABCA::ObjectHeader("emptyA", ABCA::MetaData())); archive->createChild(ABCA::ObjectHeader("emptyB", ABCA::MetaData())); // 2 objects with with the same property with no samples child = archive->createChild(ABCA::ObjectHeader( "1propA", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); child = archive->createChild(ABCA::ObjectHeader( "1propB", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); // 2 objects with with the same property with a differnt name from above child = archive->createChild(ABCA::ObjectHeader( "1propAName", ABCA::MetaData())); child->getProperties()->createArrayProperty("null", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); child = archive->createChild(ABCA::ObjectHeader( "1propBName", ABCA::MetaData())); child->getProperties()->createArrayProperty("null", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); // 2 objects with with the same property with a differnt MetaData ABCA::MetaData m; m.set("Bleep", "bloop"); child = archive->createChild(ABCA::ObjectHeader( "1propAMeta", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", m, ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); child = archive->createChild(ABCA::ObjectHeader( "1propBMeta", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", m, ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); // 2 objects with with the same property with a different POD child = archive->createChild(ABCA::ObjectHeader( "1propAPod", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kFloat32POD, 1), 0); child = archive->createChild(ABCA::ObjectHeader( "1propBPod", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kFloat32POD, 1), 0); // 2 objects with with the same property with a different extent child = archive->createChild(ABCA::ObjectHeader( "1propAExtent", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 2), 0); child = archive->createChild(ABCA::ObjectHeader( "1propBExtent", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 2), 0); // 2 objects with with the same property with a differnt time sampling child = archive->createChild(ABCA::ObjectHeader( "1propATS", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 1); child = archive->createChild(ABCA::ObjectHeader( "1propBTS", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 1); // 2 objects with 1 sample ABCA::ArrayPropertyWriterPtr awp; std::vector <Alembic::Util::int32_t> vali(4, 0); Alembic::Util::Dimensions dims(4); ABCA::DataType i32d(Alembic::Util::kInt32POD, 1); child = archive->createChild(ABCA::ObjectHeader( "1propA1Samp", ABCA::MetaData())); awp = child->getProperties()->createArrayProperty("int", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dims)); child = archive->createChild(ABCA::ObjectHeader( "1propB1Samp", ABCA::MetaData())); awp = child->getProperties()->createArrayProperty("int", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dims)); // 2 objects with 2 samples, no repeats std::vector <Alembic::Util::int32_t> valiB(4, 1); child = archive->createChild(ABCA::ObjectHeader( "1propA2Samp", ABCA::MetaData())); awp = child->getProperties()->createArrayProperty("int", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dims)); awp->setSample(ABCA::ArraySample(&(valiB.front()), i32d, dims)); child = archive->createChild(ABCA::ObjectHeader( "1propB2Samp", ABCA::MetaData())); awp = child->getProperties()->createArrayProperty("int", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dims)); awp->setSample(ABCA::ArraySample(&(valiB.front()), i32d, dims)); // 2 objects with 4 samples, with repeats child = archive->createChild(ABCA::ObjectHeader( "1propA4Samp", ABCA::MetaData())); awp = child->getProperties()->createArrayProperty("int", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dims)); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dims)); awp->setSample(ABCA::ArraySample(&(valiB.front()), i32d, dims)); awp->setSample(ABCA::ArraySample(&(valiB.front()), i32d, dims)); child = archive->createChild(ABCA::ObjectHeader( "1propB4Samp", ABCA::MetaData())); awp = child->getProperties()->createArrayProperty("int", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dims)); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dims)); awp->setSample(ABCA::ArraySample(&(valiB.front()), i32d, dims)); awp->setSample(ABCA::ArraySample(&(valiB.front()), i32d, dims)); // 2 objects with 1 samplem different dimensions Alembic::Util::Dimensions dimsB; dimsB.setRank(2); dimsB[0] = 2; dimsB[1] = 2; child = archive->createChild(ABCA::ObjectHeader( "1propA1Dims", ABCA::MetaData())); awp = child->getProperties()->createArrayProperty("int", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dimsB)); child = archive->createChild(ABCA::ObjectHeader( "1propB1Dims", ABCA::MetaData())); awp = child->getProperties()->createArrayProperty("int", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); awp->setSample(ABCA::ArraySample(&(vali.front()), i32d, dimsB)); // 2 objects with with the same 2 properties with no samples child = archive->createChild(ABCA::ObjectHeader( "2propA", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); child->getProperties()->createArrayProperty("null", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); child = archive->createChild(ABCA::ObjectHeader( "2propB", ABCA::MetaData())); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); child->getProperties()->createArrayProperty("null", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); // 2 objects with with the same 2 properties created in opposite order child = archive->createChild(ABCA::ObjectHeader( "2propASwap", ABCA::MetaData())); child->getProperties()->createArrayProperty("null", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); child = archive->createChild(ABCA::ObjectHeader( "2propBSwap", ABCA::MetaData())); child->getProperties()->createArrayProperty("null", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); child->getProperties()->createArrayProperty("empty", ABCA::MetaData(), ABCA::DataType(Alembic::Util::kInt32POD, 1), 0); } { AO::ReadArchive r; ABCA::ArchiveReaderPtr a = r( archiveName ); ABCA::ObjectReaderPtr archive = a->getTop(); TESTING_ASSERT(archive->getNumChildren() == 26); // every 2 hashes should be the same for (size_t i = 0; i < archive->getNumChildren(); i += 2) { Alembic::Util::Digest dA, dB; TESTING_ASSERT(archive->getChild(i)->getPropertiesHash(dA) && archive->getChild(i+1)->getPropertiesHash(dB)); TESTING_ASSERT(dA == dB); } // make sure that every 2 child objects have different properties hashes for (size_t i = 0; i < archive->getNumChildren() / 2; ++i) { Alembic::Util::Digest dA; archive->getChild(i*2)->getPropertiesHash(dA); for (size_t j = i + 1; j < archive->getNumChildren() / 2; ++j) { Alembic::Util::Digest dB; archive->getChild(j*2)->getPropertiesHash(dB); TESTING_ASSERT(dA != dB); } } } }