Iu32vec4 mandel_4(F32vec4 &c_re4, F32vec4 &c_im4, int max_iterations) { F32vec4 z_re4 = c_re4; F32vec4 z_im4 = c_im4; F32vec4 four4(4.0f); F32vec4 two4(2.0f); Iu32vec4 count4(0,0,0,0); Iu32vec4 one4(1,1,1,1); int i; for (i = 0; i < max_iterations; ++i) { F32vec4 z_re24 = z_re4 * z_re4; F32vec4 z_im24 = z_im4 * z_im4; F32vec4 mf4 = cmplt(z_re24 + z_im24, four4); Iu32vec4 mi4 (_mm_castps_si128((__m128)mf4)); if (is_zero (mi4)) { break; } F32vec4 new_re4 = z_re24 - z_im24; F32vec4 new_im4 = two4 * z_re4 * z_im4; z_re4 = c_re4 + new_re4; z_im4 = c_im4 + new_im4; count4 = count4 + (mi4 & one4); } return count4; }
TEST(Pointer, SPtr) { static int count = 0; struct counter { counter() { ++count; } ~counter() { --count; } void nop() {} }; struct counter_inherit : counter {}; { util::sptr<counter> count0(new counter); ASSERT_TRUE(count0.not_nul()); ASSERT_TRUE((*count0).not_nul()); ASSERT_EQ(1, count); util::sref<counter> refcount0 = *count0; util::sptr<counter> count1(std::move(count0)); ASSERT_EQ(1, count); util::sref<counter> refcount1 = *count1; ASSERT_EQ(refcount0.id().str(), refcount1.id().str()); ASSERT_EQ(refcount0.id().str(), count1.id().str()); ASSERT_TRUE(count0.nul()); ASSERT_TRUE((*count0).nul()); util::sptr<counter_inherit> count2(new counter_inherit); count1 = std::move(count2); ASSERT_EQ(1, count); util::sptr<counter_inherit> count3(new counter_inherit); ASSERT_EQ(2, count); util::sptr<counter> count4(std::move(count3)); count4->nop(); } ASSERT_EQ(0, count); }