TEST_F(BitSet64Test, BitWiseOr) { b1.markBit(20); b2.markBit(40); BitSet64 tmp = b1 | b2; EXPECT_EQ(tmp.count(), 2u); EXPECT_TRUE(tmp.hasBit(20) && tmp.hasBit(40)); // Check that the operator is symmetric EXPECT_TRUE((b2 | b1) == (b1 | b2)); b1 |= b2; EXPECT_EQ(b1.count(), 2u); EXPECT_TRUE(b1.hasBit(20) && b1.hasBit(40)); EXPECT_TRUE(b2.hasBit(40) && b2.count() == 1u); }
TEST_F(BitSet64Test, BitWiseAnd_Disjoint) { b1.markBit(20); b1.markBit(40); b1.markBit(60); BitSet64 tmp = b1 & b2; EXPECT_TRUE(tmp.isEmpty()); // Check that the operator is symmetric EXPECT_TRUE((b2 & b1) == (b1 & b2)); b2 &= b1; EXPECT_TRUE(b2.isEmpty()); EXPECT_EQ(b1.count(), 3u); EXPECT_TRUE(b1.hasBit(20) && b1.hasBit(40) && b1.hasBit(60)); }
static void pointerCoordsToNative(JNIEnv* env, jobject pointerCoordsObj, float xOffset, float yOffset, PointerCoords* outRawPointerCoords) { outRawPointerCoords->clear(); outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_X, env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.x) - xOffset); outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_Y, env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.y) - yOffset); outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.pressure)); outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_SIZE, env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.size)); outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.touchMajor)); outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.touchMinor)); outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.toolMajor)); outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.toolMinor)); outRawPointerCoords->setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, env->GetFloatField(pointerCoordsObj, gPointerCoordsClassInfo.orientation)); BitSet64 bits = BitSet64(env->GetLongField(pointerCoordsObj, gPointerCoordsClassInfo.mPackedAxisBits)); if (!bits.isEmpty()) { jfloatArray valuesArray = jfloatArray(env->GetObjectField(pointerCoordsObj, gPointerCoordsClassInfo.mPackedAxisValues)); if (valuesArray) { jfloat* values = static_cast<jfloat*>( env->GetPrimitiveArrayCritical(valuesArray, NULL)); uint32_t index = 0; do { uint32_t axis = bits.clearFirstMarkedBit(); outRawPointerCoords->setAxisValue(axis, values[index++]); } while (!bits.isEmpty()); env->ReleasePrimitiveArrayCritical(valuesArray, values, JNI_ABORT); env->DeleteLocalRef(valuesArray); } } }
static void pointerCoordsFromNative(JNIEnv* env, const PointerCoords* rawPointerCoords, float xOffset, float yOffset, jobject outPointerCoordsObj) { env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.x, rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_X) + xOffset); env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.y, rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_Y) + yOffset); env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.pressure, rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_PRESSURE)); env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.size, rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_SIZE)); env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.touchMajor, rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR)); env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.touchMinor, rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR)); env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.toolMajor, rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR)); env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.toolMinor, rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR)); env->SetFloatField(outPointerCoordsObj, gPointerCoordsClassInfo.orientation, rawPointerCoords->getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION)); uint64_t outBits = 0; BitSet64 bits = BitSet64(rawPointerCoords->bits); bits.clearBit(AMOTION_EVENT_AXIS_X); bits.clearBit(AMOTION_EVENT_AXIS_Y); bits.clearBit(AMOTION_EVENT_AXIS_PRESSURE); bits.clearBit(AMOTION_EVENT_AXIS_SIZE); bits.clearBit(AMOTION_EVENT_AXIS_TOUCH_MAJOR); bits.clearBit(AMOTION_EVENT_AXIS_TOUCH_MINOR); bits.clearBit(AMOTION_EVENT_AXIS_TOOL_MAJOR); bits.clearBit(AMOTION_EVENT_AXIS_TOOL_MINOR); bits.clearBit(AMOTION_EVENT_AXIS_ORIENTATION); if (!bits.isEmpty()) { uint32_t packedAxesCount = bits.count(); jfloatArray outValuesArray = obtainPackedAxisValuesArray(env, packedAxesCount, outPointerCoordsObj); if (!outValuesArray) { return; // OOM } jfloat* outValues = static_cast<jfloat*>(env->GetPrimitiveArrayCritical( outValuesArray, NULL)); const float* values = rawPointerCoords->values; uint32_t index = 0; do { uint32_t axis = bits.clearFirstMarkedBit(); outBits |= BitSet64::valueForBit(axis); outValues[index++] = rawPointerCoords->getAxisValue(axis); } while (!bits.isEmpty()); env->ReleasePrimitiveArrayCritical(outValuesArray, outValues, 0); env->DeleteLocalRef(outValuesArray); } env->SetLongField(outPointerCoordsObj, gPointerCoordsClassInfo.mPackedAxisBits, outBits); }
virtual void TearDown() { b1.clear(); b2.clear(); }