blob: 753c137696d89f63175d70ca1920a83f1cf979ab [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _DECAF_UTIL_UUID_H_
#define _DECAF_UTIL_UUID_H_
#include <decaf/util/Config.h>
#include <decaf/lang/Comparable.h>
#include <decaf/lang/exceptions/UnsupportedOperationException.h>
#include <decaf/lang/exceptions/IllegalArgumentException.h>
#include <apr_uuid.h>
#include <string>
namespace decaf{
namespace util{
/**
* A class that represents an immutable universally unique identifier (UUID).
* A UUID represents a 128-bit value.
*
* There exist different variants of these global identifiers. The methods of
* this class are for manipulating the Leach-Salz variant, although the
* constructors allow the creation of any variant of UUID (described below).
*
* The layout of a variant 2 (Leach-Salz) UUID is as follows: The most
* significant long consists of the following unsigned fields:
*
* 0xFFFFFFFF00000000 time_low
* 0x00000000FFFF0000 time_mid
* 0x000000000000F000 version
* 0x0000000000000FFF time_hi
*
* The least significant long consists of the following unsigned fields:
*
* 0xC000000000000000 variant
* 0x3FFF000000000000 clock_seq
* 0x0000FFFFFFFFFFFF node
*
* The variant field contains a value which identifies the layout of the UUID.
* The bit layout described above is valid only for a UUID with a variant value
* of 2, which indicates the Leach-Salz variant.
*
* The version field holds a value that describes the type of this UUID. There
* are four different basic types of UUIDs: time-based, DCE security, name-based,
* and randomly generated UUIDs. These types have a version value of 1, 2, 3 and
* 4, respectively.
*
* For more information including algorithms used to create UUIDs, see the
* Internet-Draft UUIDs and GUIDs or the standards body definition at
* ISO/IEC 11578:1996.
*/
class UUID : public lang::Comparable<UUID> {
private:
// APR Uuid Type
apr_uuid_t apr_uuid;
// Copy of the High part of the data
unsigned long long mostSigBits;
// Copy of the Low part of the data
unsigned long long leastSigBits;
// Version indicator, set when a UUID is generated
int uuidVersion;
public:
/**
* Static factory to retrieve a type 4 (pseudo randomly generated) UUID.
* The UUID is generated using a cryptographically strong pseudo random
* number generator.
* @return type 4 UUID
*/
static UUID randomUUID();
/**
* Static factory to retrieve a type 3 (name based) UUID based on the
* specified byte array.
* @param name - a byte array to be used to construct a UUID.
* @return type 3 UUID
*/
static UUID nameUUIDFromBytes( const std::vector<char>& name );
/**
* Static factory to retrieve a type 3 (name based) UUID based on the
* specified byte array.
* @param name - a byte array to be used to construct a UUID.
* @param size - the size of the byte array, or number of bytes to use.
* @return type 3 UUID
*/
static UUID nameUUIDFromBytes( const char* name, std::size_t size );
/**
* Creates a UUID from the string standard representation as described
* in the toString() method.
* @param name - a string to be used to construct a UUID.
* @return type 3 UUID
*/
static UUID fromString( const std::string& name )
throw ( lang::exceptions::IllegalArgumentException );
public:
/**
* Constructs a new UUID using the specified data. mostSigBits is used
* for the most significant 64 bits of the UUID and leastSigBits becomes
* the least significant 64 bits of the UUID.
* @param mostSigBits
* @param leastSigBits
*/
UUID( long long mostSigBits, long long leastSigBits );
virtual ~UUID();
/**
* Compare the given UUID to this one
* @param value - the UUID to compare to
*/
virtual int compareTo( const UUID& value ) const;
/**
* Compares this UUID to the one given, returns true if they are
* equal
* @param value - the UUID to compare to.
* @return true if UUIDs are the same.
*/
virtual bool equals( const UUID& value ) const;
/**
* Compares equality between this object and the one passed.
* @param value - the value to be compared to this one.
* @return true if this object is equal to the one passed.
*/
virtual bool operator==( const UUID& value ) const;
/**
* Compares this object to another and returns true if this object
* is considered to be less than the one passed. This
* @param value - the value to be compared to this one.
* @return true if this object is equal to the one passed.
*/
virtual bool operator<( const UUID& value ) const;
/**
* Returns a String object representing this UUID. UUID's are formatted
* as: 00112233-4455-6677-8899-AABBCCDDEEFF whose length is 36.
* @returns formatted string for this UUID
*/
virtual std::string toString() const;
/**
* @returns the most significant 64 bits of this UUID's 128 bit value.
*/
virtual long long getLeastSignificantBits() const;
/**
* @returns the most significant 64 bits of this UUID's 128 bit value.
*/
virtual long long getMostSignificantBits() const;
/**
* The node value associated with this UUID.
*
* The 48 bit node value is constructed from the node field of this UUID.
* This field is intended to hold the IEEE 802 address of the machine that
* generated this UUID to guarantee spatial uniqueness.
*
* The node value is only meaningful in a time-based UUID, which has
* version type 1. If this UUID is not a time-based UUID then this method
* throws UnsupportedOperationException.
* @returns the node value of this UUID
* @throws UnsupportedOperationException
*/
virtual long long node()
throw ( lang::exceptions::UnsupportedOperationException );
/**
* The timestamp value associated with this UUID.
*
* The 60 bit timestamp value is constructed from the time_low, time_mid,
* and time_hi fields of this UUID. The resulting timestamp is measured in
* 100-nanosecond units since midnight, October 15, 1582 UTC.
*
* The timestamp value is only meaningful in a time-based UUID, which has
* version type 1. If this UUID is not a time-based UUID then this method
* throws UnsupportedOperationException.
* @returns the timestamp associated with a V1 UUID
* @throws UnsupportedOperationException
*/
virtual long long timestamp()
throw ( lang::exceptions::UnsupportedOperationException );
/**
* The clock sequence value associated with this UUID.
*
* The 14 bit clock sequence value is constructed from the clock sequence
* field of this UUID. The clock sequence field is used to guarantee temporal
* uniqueness in a time-based UUID.
*
* The clockSequence value is only meaningful in a time-based UUID, which
* has version type 1. If this UUID is not a time-based UUID then this
* method throws UnsupportedOperationException.
* @returns the clockSequeunce associated with a V1 UUID
* @throws UnsupportedOperationException
*/
virtual int clockSequence()
throw ( lang::exceptions::UnsupportedOperationException );
/**
* The variant number associated with this UUID. The variant number describes
* the layout of the UUID. The variant number has the following meaning:
*
* * 0 Reserved for NCS backward compatibility
* * 2 The Leach-Salz variant (used by this class)
* * 6 Reserved, Microsoft Corporation backward compatibility
* * 7 Reserved for future definition
*
* @returns the variant associated with a V1 UUID
* @throws UnsupportedOperationException
*/
virtual int variant()
throw ( lang::exceptions::UnsupportedOperationException );
/**
* The version number associated with this UUID. The version number describes
* how this UUID was generated. The version number has the following meaning:
*
* * 1 Time-based UUID
* * 2 DCE security UUID
* * 3 Name-based UUID
* * 4 Randomly generated UUID
*
* @returns the version associated with a V1 UUID
* @throws UnsupportedOperationException
*/
virtual int version()
throw ( lang::exceptions::UnsupportedOperationException );
};
}}
#endif /*_DECAF_UTIL_UUID_H_*/