Logo Search packages:      
Sourcecode: icu version File versions

LESwaps.h

/*
 * @(#)LESwaps.h  1.3 00/03/15
 *
 * (C) Copyright IBM Corp. 1998, 1999, 2000 - All Rights Reserved
 *
 */

#ifndef __LESWAPS_H
#define __LESWAPS_H

#include "LETypes.h"

U_NAMESPACE_BEGIN

/**
 * These are convenience macros which invoke the swap functions
 * from a concise call.
 */
#define SWAPW(value) (LESwaps::isBigEndian() ? (value) : LESwaps::swapWord(value))
#define SWAPL(value) (LESwaps::isBigEndian() ? (value) : LESwaps::swapLong(value))

/**
 * This class is used to access data which stored in big endian order
 * regardless of the conventions of the platform. It has been designed
 * to automatically detect the endian-ness of the platform, so that a
 * compilation flag is not needed.
 *
 * All methods are static and inline in an attempt to induce the compiler
 * to do most of the calculations at compile time.
 */
00032 class LESwaps
{
public:

    /**
     * This method detects the endian-ness of the platform by
     * casting a pointer to a word to a pointer to a byte. On
     * big endian platforms the FF will be in the byte with the
     * lowest address. On little endian platforms, the FF will
     * be in the byte with the highest address.
     *
     * @return true if the platform is big endian
     */
00045     static le_bool isBigEndian()
    {
        static const le_uint16 word = 0xFF00;

        return *((le_uint8 *) &word);
    };

    /**
     * This method the byte swap required on little endian platforms
     * to correctly access a word.
     *
     * @param value - the word to be byte swapped
     *
     * @return the byte swapped word
     */
00060     static le_uint16 swapWord(le_uint16 value)
    {
        return (((le_uint8) (value >> 8)) | (value << 8));
    };

    /**
     * This method does the byte swapping required on little endian platforms
     * to correctly access a long.
     *
     * @param value - the long to be byte swapped
     *
     * @return the byte swapped long
     */
00073     static le_uint32 swapLong(le_uint32 value)
    {
        return swapWord((le_uint16) (value >> 16)) | (swapWord((le_uint16) value) << 16);
    };
};

U_NAMESPACE_END
#endif

Generated by  Doxygen 1.6.0   Back to index