Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/tools/include/linux/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 5 kB image not shown  

Quelle  bitmap.h   Sprache: C

 
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _TOOLS_LINUX_BITMAP_H
#define _TOOLS_LINUX_BITMAP_H

#include <string.h>
#include <asm-generic/bitsperlong.h>
#include <linux/align.h>
#include <linux/bitops.h>
#include <linux/find.h>
#include <stdlib.h>
#include <linux/kernel.h>

#define DECLARE_BITMAP(name,bits) \
 unsigned long name[BITS_TO_LONGS(bits)]

unsigned int __bitmap_weight(const unsigned long *bitmap, int bits);
void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
   const unsigned long *bitmap2, int bits);
bool __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
   const unsigned long *bitmap2, unsigned int bits);
bool __bitmap_equal(const unsigned long *bitmap1,
      const unsigned long *bitmap2, unsigned int bits);
void __bitmap_set(unsigned long *map, unsigned int start, int len);
void __bitmap_clear(unsigned long *map, unsigned int start, int len);
bool __bitmap_intersects(const unsigned long *bitmap1,
    const unsigned long *bitmap2, unsigned int bits);

#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1)))
#define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1)))

#define bitmap_size(nbits) (ALIGN(nbits, BITS_PER_LONG) / BITS_PER_BYTE)

static inline void bitmap_zero(unsigned long *dst, unsigned int nbits)
{
 if (small_const_nbits(nbits))
  *dst = 0UL;
 else {
  memset(dst, 0, bitmap_size(nbits));
 }
}

static inline void bitmap_fill(unsigned long *dst, unsigned int nbits)
{
 unsigned int nlongs = BITS_TO_LONGS(nbits);
 if (!small_const_nbits(nbits)) {
  unsigned int len = (nlongs - 1) * sizeof(unsigned long);
  memset(dst, 0xff,  len);
 }
 dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits);
}

static inline bool bitmap_empty(const unsigned long *src, unsigned int nbits)
{
 if (small_const_nbits(nbits))
  return ! (*src & BITMAP_LAST_WORD_MASK(nbits));

 return find_first_bit(src, nbits) == nbits;
}

static inline bool bitmap_full(const unsigned long *src, unsigned int nbits)
{
 if (small_const_nbits(nbits))
  return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));

 return find_first_zero_bit(src, nbits) == nbits;
}

static inline unsigned int bitmap_weight(const unsigned long *src, unsigned int nbits)
{
 if (small_const_nbits(nbits))
  return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
 return __bitmap_weight(src, nbits);
}

static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
        const unsigned long *src2, unsigned int nbits)
{
 if (small_const_nbits(nbits))
  *dst = *src1 | *src2;
 else
  __bitmap_or(dst, src1, src2, nbits);
}

static inline unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags __maybe_unused)
{
 return malloc(bitmap_size(nbits));
}

/**
 * bitmap_zalloc - Allocate bitmap
 * @nbits: Number of bits
 */

static inline unsigned long *bitmap_zalloc(int nbits)
{
 return calloc(1, bitmap_size(nbits));
}

/*
 * bitmap_free - Free bitmap
 * @bitmap: pointer to bitmap
 */

static inline void bitmap_free(unsigned long *bitmap)
{
 free(bitmap);
}

/*
 * bitmap_scnprintf - print bitmap list into buffer
 * @bitmap: bitmap
 * @nbits: size of bitmap
 * @buf: buffer to store output
 * @size: size of @buf
 */

size_t bitmap_scnprintf(unsigned long *bitmap, unsigned int nbits,
   char *buf, size_t size);

/**
 * bitmap_and - Do logical and on bitmaps
 * @dst: resulting bitmap
 * @src1: operand 1
 * @src2: operand 2
 * @nbits: size of bitmap
 */

static inline bool bitmap_and(unsigned long *dst, const unsigned long *src1,
        const unsigned long *src2, unsigned int nbits)
{
 if (small_const_nbits(nbits))
  return (*dst = *src1 & *src2 & BITMAP_LAST_WORD_MASK(nbits)) != 0;
 return __bitmap_and(dst, src1, src2, nbits);
}

#ifdef __LITTLE_ENDIAN
#define BITMAP_MEM_ALIGNMENT 8
#else
#define BITMAP_MEM_ALIGNMENT (8 * sizeof(unsigned long))
#endif
#define BITMAP_MEM_MASK (BITMAP_MEM_ALIGNMENT - 1)

static inline bool bitmap_equal(const unsigned long *src1,
    const unsigned long *src2, unsigned int nbits)
{
 if (small_const_nbits(nbits))
  return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
 if (__builtin_constant_p(nbits & BITMAP_MEM_MASK) &&
     IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT))
  return !memcmp(src1, src2, nbits / 8);
 return __bitmap_equal(src1, src2, nbits);
}

static inline bool bitmap_intersects(const unsigned long *src1,
         const unsigned long *src2,
         unsigned int nbits)
{
 if (small_const_nbits(nbits))
  return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
 else
  return __bitmap_intersects(src1, src2, nbits);
}

static inline void bitmap_set(unsigned long *map, unsigned int start, unsigned int nbits)
{
 if (__builtin_constant_p(nbits) && nbits == 1)
  __set_bit(start, map);
 else if (small_const_nbits(start + nbits))
  *map |= GENMASK(start + nbits - 1, start);
 else if (__builtin_constant_p(start & BITMAP_MEM_MASK) &&
   IS_ALIGNED(start, BITMAP_MEM_ALIGNMENT) &&
   __builtin_constant_p(nbits & BITMAP_MEM_MASK) &&
   IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT))
  memset((char *)map + start / 8, 0xff, nbits / 8);
 else
  __bitmap_set(map, start, nbits);
}

static inline void bitmap_clear(unsigned long *map, unsigned int start,
          unsigned int nbits)
{
 if (__builtin_constant_p(nbits) && nbits == 1)
  __clear_bit(start, map);
 else if (small_const_nbits(start + nbits))
  *map &= ~GENMASK(start + nbits - 1, start);
 else if (__builtin_constant_p(start & BITMAP_MEM_MASK) &&
   IS_ALIGNED(start, BITMAP_MEM_ALIGNMENT) &&
   __builtin_constant_p(nbits & BITMAP_MEM_MASK) &&
   IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT))
  memset((char *)map + start / 8, 0, nbits / 8);
 else
  __bitmap_clear(map, start, nbits);
}
#endif /* _TOOLS_LINUX_BITMAP_H */

Messung V0.5
C=94 H=99 G=96

¤ Dauer der Verarbeitung: 0.4 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

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.