Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Postgres/src/test/modules/test_lfind/   (Postgres Database Version 18.4©)  Datei vom 11.4.2026 mit Größe 4 kB image not shown  

Quelle  test_lfind.c

  Sprache: C
 

/*--------------------------------------------------------------------------
 *
 * test_lfind.c
 *  Test correctness of optimized linear search functions.
 *
 * Copyright (c) 2022-2025, PostgreSQL Global Development Group
 *
 * IDENTIFICATION
 *  src/test/modules/test_lfind/test_lfind.c
 *
 * -------------------------------------------------------------------------
 */


#include "postgres.h"

#include "fmgr.h"
#include "port/pg_lfind.h"

/*
 * Convenience macros for testing both vector and scalar operations. The 2x
 * factor is to make sure iteration works
 */

#define LEN_NO_TAIL(vectortype) (2 * sizeof(vectortype))
#define LEN_WITH_TAIL(vectortype) (LEN_NO_TAIL(vectortype) + 3)

PG_MODULE_MAGIC;

/* workhorse for test_lfind8 */
static void
test_lfind8_internal(uint8 key)
{
 uint8  charbuf[LEN_WITH_TAIL(Vector8)];
 const int len_no_tail = LEN_NO_TAIL(Vector8);
 const int len_with_tail = LEN_WITH_TAIL(Vector8);

 memset(charbuf, 0xFF, len_with_tail);
 /* search tail to test one-byte-at-a-time path */
 charbuf[len_with_tail - 1] = key;
 if (key > 0x00 && pg_lfind8(key - 1, charbuf, len_with_tail))
  elog(ERROR, "pg_lfind8() found nonexistent element '0x%x'", key - 1);
 if (key < 0xFF && !pg_lfind8(key, charbuf, len_with_tail))
  elog(ERROR, "pg_lfind8() did not find existing element '0x%x'", key);
 if (key < 0xFE && pg_lfind8(key + 1, charbuf, len_with_tail))
  elog(ERROR, "pg_lfind8() found nonexistent element '0x%x'", key + 1);

 memset(charbuf, 0xFF, len_with_tail);
 /* search with vector operations */
 charbuf[len_no_tail - 1] = key;
 if (key > 0x00 && pg_lfind8(key - 1, charbuf, len_no_tail))
  elog(ERROR, "pg_lfind8() found nonexistent element '0x%x'", key - 1);
 if (key < 0xFF && !pg_lfind8(key, charbuf, len_no_tail))
  elog(ERROR, "pg_lfind8() did not find existing element '0x%x'", key);
 if (key < 0xFE && pg_lfind8(key + 1, charbuf, len_no_tail))
  elog(ERROR, "pg_lfind8() found nonexistent element '0x%x'", key + 1);
}

PG_FUNCTION_INFO_V1(test_lfind8);
Datum
test_lfind8(PG_FUNCTION_ARGS)
{
 test_lfind8_internal(0);
 test_lfind8_internal(1);
 test_lfind8_internal(0x7F);
 test_lfind8_internal(0x80);
 test_lfind8_internal(0x81);
 test_lfind8_internal(0xFD);
 test_lfind8_internal(0xFE);
 test_lfind8_internal(0xFF);

 PG_RETURN_VOID();
}

/* workhorse for test_lfind8_le */
static void
test_lfind8_le_internal(uint8 key)
{
 uint8  charbuf[LEN_WITH_TAIL(Vector8)];
 const int len_no_tail = LEN_NO_TAIL(Vector8);
 const int len_with_tail = LEN_WITH_TAIL(Vector8);

 memset(charbuf, 0xFF, len_with_tail);
 /* search tail to test one-byte-at-a-time path */
 charbuf[len_with_tail - 1] = key;
 if (key > 0x00 && pg_lfind8_le(key - 1, charbuf, len_with_tail))
  elog(ERROR, "pg_lfind8_le() found nonexistent element <= '0x%x'", key - 1);
 if (key < 0xFF && !pg_lfind8_le(key, charbuf, len_with_tail))
  elog(ERROR, "pg_lfind8_le() did not find existing element <= '0x%x'", key);
 if (key < 0xFE && !pg_lfind8_le(key + 1, charbuf, len_with_tail))
  elog(ERROR, "pg_lfind8_le() did not find existing element <= '0x%x'", key + 1);

 memset(charbuf, 0xFF, len_with_tail);
 /* search with vector operations */
 charbuf[len_no_tail - 1] = key;
 if (key > 0x00 && pg_lfind8_le(key - 1, charbuf, len_no_tail))
  elog(ERROR, "pg_lfind8_le() found nonexistent element <= '0x%x'", key - 1);
 if (key < 0xFF && !pg_lfind8_le(key, charbuf, len_no_tail))
  elog(ERROR, "pg_lfind8_le() did not find existing element <= '0x%x'", key);
 if (key < 0xFE && !pg_lfind8_le(key + 1, charbuf, len_no_tail))
  elog(ERROR, "pg_lfind8_le() did not find existing element <= '0x%x'", key + 1);
}

PG_FUNCTION_INFO_V1(test_lfind8_le);
Datum
test_lfind8_le(PG_FUNCTION_ARGS)
{
 test_lfind8_le_internal(0);
 test_lfind8_le_internal(1);
 test_lfind8_le_internal(0x7F);
 test_lfind8_le_internal(0x80);
 test_lfind8_le_internal(0x81);
 test_lfind8_le_internal(0xFD);
 test_lfind8_le_internal(0xFE);
 test_lfind8_le_internal(0xFF);

 PG_RETURN_VOID();
}

PG_FUNCTION_INFO_V1(test_lfind32);
Datum
test_lfind32(PG_FUNCTION_ARGS)
{
#define TEST_ARRAY_SIZE 135
 uint32  test_array[TEST_ARRAY_SIZE] = {0};

 test_array[8] = 1;
 test_array[64] = 2;
 test_array[TEST_ARRAY_SIZE - 1] = 3;

 if (pg_lfind32(1, test_array, 4))
  elog(ERROR, "pg_lfind32() found nonexistent element");
 if (!pg_lfind32(1, test_array, TEST_ARRAY_SIZE))
  elog(ERROR, "pg_lfind32() did not find existing element");

 if (pg_lfind32(2, test_array, 32))
  elog(ERROR, "pg_lfind32() found nonexistent element");
 if (!pg_lfind32(2, test_array, TEST_ARRAY_SIZE))
  elog(ERROR, "pg_lfind32() did not find existing element");

 if (pg_lfind32(3, test_array, 96))
  elog(ERROR, "pg_lfind32() found nonexistent element");
 if (!pg_lfind32(3, test_array, TEST_ARRAY_SIZE))
  elog(ERROR, "pg_lfind32() did not find existing element");

 if (pg_lfind32(4, test_array, TEST_ARRAY_SIZE))
  elog(ERROR, "pg_lfind32() found nonexistent element");

 PG_RETURN_VOID();
}

Messung V0.5 in Prozent
C=82 H=98 G=90

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet am  2026-08-08) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.