• [^] # Re: compteur ?

    Posté par . En réponse au journal Parlons C, parlons pipe !. Évalué à 1.

    Petite implémentation sans compteur, pour le fun:

    #include <stdio.h>
    #include <stdint.h>
    #include <assert.h>
    typedef uint64_t fifo_t;
    #define FIFO_CAPACITY (sizeof(fifo_t))
    static inline void fifo_init(fifo_t *f) {
     *f = 0;
    }
    static inline int fifo_is_empty(fifo_t *f) {
     return ((*f) == 0);
    }
    static inline void fifo_push(fifo_t *f, char val) {
     *f <<= 8;
     *f |= (0x80 | val);
    }
    static inline char fifo_read(fifo_t *f) {
     char res;
     while ((*f & (0x80UL << (8 * (FIFO_CAPACITY - 1)))) == 0)
     *f <<= 8;
     res = (*f & (0x7fUL << (8 * (FIFO_CAPACITY - 1)))) >> (8 * (FIFO_CAPACITY - 1));
     *f <<= 8;
     return res;
    }
    int main(int ac, char **av) {
     const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
     fifo_t fifo;
     int i;
     fifo_init(&fifo);
     assert(fifo_is_empty(&fifo));
     for (i = 0; i < FIFO_CAPACITY; i++)
     fifo_push(&fifo, alphabet[i]);
     while (!fifo_is_empty(&fifo))
     printf("Read: %c\n", fifo_read(&fifo));
     assert(fifo_is_empty(&fifo));
     fifo_push(&fifo, 'z');
     assert(fifo_read(&fifo) == 'z');
     return 0;
    }