int main() { printf("%hhd\n", 0xFF^(2-1)); printf("%ld, long max = %ld\n", firstbit(long), typemax(long)); printf("%ld, int64_t max = %ld\n", firstbit(int64_t), typemax(int64_t)); printf("%d, int32_t max = %ld\n", firstbit(int32_t), typemax(int32_t)); printf("%d, char max = %d\n", firstbit(char), typemax(char)); printf("%d, int max = %d\n", firstbit(int), typemax(int)); return 0; }
TEST(FirstBitTest, firstbit64) { // firstbit arg is uint64_t // There are no overloads, so we don't have to worry about which // one is being tested. EXPECT_EQ(0, firstbit(0)); EXPECT_EQ(0, firstbit(1)); EXPECT_EQ(1, firstbit(2)); EXPECT_EQ(1, firstbit(3)); EXPECT_EQ(2, firstbit(4)); EXPECT_EQ(4, firstbit(31)); EXPECT_EQ(5, firstbit(32)); for (int i = 1; i < 64; i++) { EXPECT_EQ(i - 1, firstbit((UINT64_C(1) << i) - 1)); EXPECT_EQ(i, firstbit((UINT64_C(1) << i))); } }
// List the configuration space of the GVI device. void do_listconfig(Display *dpy, int gvi) { NVCTRLAttributeValidValuesRec values; unsigned int fmts[3]; int i; char *pOut = NULL; Bool ret; // Assume GVI device has been configured already. if (gvi < 0) { gvi = 0; } printf("Querying Valid Configuring Space of GVI device %d:\n\n", gvi); /* Query stream (link to jack+channel) topology */ ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, // target_id 0, // display_mask NV_CTRL_STRING_OPERATION_GVI_CONFIGURE_STREAMS, NULL, // pIn &pOut); if (!ret || !pOut) { printf(" - Failed to query stream topology configuration of " "GVI %d.\n", gvi); return; } printf("- Current Topology:\n\n"); printf(" %s\n\n", pOut ? pOut : "No streams are configured."); XFree(pOut); pOut = NULL; ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, &values); if (!ret) { printf("- Failed to query valid video format values(1) of " "GVI %d.\n", gvi); return; } fmts[0] = values.u.bits.ints; ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2, &values); if (!ret) { printf("- Failed to query valid video format values(2) of " "GVI %d.\n", gvi); return; } fmts[1] = values.u.bits.ints; ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3, &values); if (!ret) { printf("- Failed to query valid video format values(3) of " "GVI %d.\n", gvi); return; } fmts[2] = values.u.bits.ints; printf("- Valid Formats (NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT): %08x\n", fmts[0]); printf("- Valid Formats (NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2): %08x\n", fmts[1]); printf("- Valid Formats (NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3): %08x\n", fmts[2]); printf("\n"); for (i = 0; i < 3; i++) { unsigned int fmt_list = fmts[i]; unsigned int fmt_bit; unsigned int fmt; unsigned int fmt_flags; unsigned int bpcs; unsigned int bpc_bit; unsigned int bpc; unsigned int samplings; unsigned int smp_bit; unsigned int sampling; while (fmt_list) { fmt_bit = firstbit(fmt_list); fmt_list &= (~fmt_bit); fmt = ffs(fmt_bit) - 1 + (32*i); printf("\n%s", VideoFormatName(fmt)); ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, fmt, // display_mask NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS, (int *)&fmt_flags); if (!ret) { printf(" - Failed to query flag bits for video format for " "GVI %d.\n", gvi); } else if (fmt_flags == NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_NONE) { printf(" (No flags set): \n"); } else { printf(" (Flags:"); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_INTERLACED) ? 'I' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_PROGRESSIVE) ? 'P' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_PSF) ? 'F' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_A) ? 'A' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_B) ? 'B' : '_'); printf("%c", (fmt_flags & NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_1080P_NO_12BPC) ? 'N' : '_'); printf("):\n"); } // Set the video format XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT, fmt); // Get all bits per component (on first jack/channel) ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // jack 0, channel 0 NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT, &values); if (!ret) { printf(" - Failed to query valid bits per component " "of GVI %d.\n", gvi); continue; } bpcs = values.u.bits.ints; while (bpcs) { bpc_bit = firstbit(bpcs); bpcs &= (~bpc_bit); bpc = ffs(bpc_bit) -1; printf(" %s:\n", BPCName(bpc)); // Set the bits per component XNVCTRLSetTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // jack 0, channel 0 NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT, bpc); // Get all component samplings (on first jack/channel) ret = XNVCTRLQueryValidTargetAttributeValues(dpy, NV_CTRL_TARGET_TYPE_GVI, gvi, 0, // display_mask NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING, &values); if (!ret) { printf(" - Failed to query valid component sampling " "values of GVI %d.\n", gvi); continue; } samplings = values.u.bits.ints; while (samplings) { smp_bit = firstbit(samplings); samplings &= (~smp_bit); sampling = ffs(smp_bit) -1; printf(" %s\n", SamplingName(sampling)); } // All component samplings } // Add BPC } // All formats } // All format lists } /* do_listconfig() */