Click here to Skip to main content
15,891,905 members
Articles / Programming Languages / C#

Windows Development in C++, COM API Clients

Rate me:
Please Sign up or sign in to vote.
4.98/5 (31 votes)
3 Jan 2015CPOL7 min read 63K   1.6K   106  
Using the Facade Pattern to simplify development with COM based APIs
// hwintypes.h
#pragma once

#ifndef __HWINTYPES_H__
#define __HWINTYPES_H__

#include "hwinstring.h"
#include "hwinexception.h"

namespace harlinn
{
    namespace windows
    {
        enum class UnicodeCategory : char
        {
            // Uppercase letter. Signified by the Unicode designation "Lu" (letter, uppercase).
            UppercaseLetter = 0,
            // Lowercase letter. Signified by the Unicode designation "Ll" (letter, lowercase).
            LowercaseLetter = 1,
            // Titlecase letter. Signified by the Unicode designation "Lt" (letter, titlecase).
            TitlecaseLetter = 2,
            // Modifier letter character, which is free-standing spacing character that
            // indicates modifications of a preceding letter. Signified by the Unicode designation
            // "Lm" (letter, modifier).
            ModifierLetter = 3,
            // Letter that is not an uppercase letter, a lowercase letter, a titlecase letter,
            // or a modifier letter. Signified by the Unicode designation "Lo" (letter,
            // other).
            OtherLetter = 4,
            // Nonspacing character that indicates modifications of a base character. Signified
            // by the Unicode designation "Mn" (mark, nonspacing).
            NonSpacingMark = 5,
            // Spacing character that indicates modifications of a base character and affects
            // the width of the glyph for that base character. Signified by the Unicode
            // designation "Mc" (mark, spacing combining).
            SpacingCombiningMark = 6,
            // Enclosing mark character, which is a nonspacing combining character that
            // surrounds all previous characters up to and including a base character. Signified
            // by the Unicode designation "Me" (mark, enclosing).
            EnclosingMark = 7,
            // Decimal digit character, that is, a character in the range 0 through 9. Signified
            // by the Unicode designation "Nd" (number, decimal digit).
            DecimalDigitNumber = 8,
            // Number represented by a letter, instead of a decimal digit, for example,
            // the Roman numeral for five, which is "V". The indicator is signified by the
            // Unicode designation "Nl" (number, letter).
            LetterNumber = 9,
            // Number that is neither a decimal digit nor a letter number, for example,
            // the fraction 1/2. The indicator is signified by the Unicode designation "No"
            // (number, other).
            OtherNumber = 10,
            // Space character, which has no glyph but is not a control or format character.
            // Signified by the Unicode designation "Zs" (separator, space).
            SpaceSeparator = 11,
            // Character that is used to separate lines of text. Signified by the Unicode
            // designation "Zl" (separator, line).
            LineSeparator = 12,
            // Character used to separate paragraphs. Signified by the Unicode designation
            // "Zp" (separator, paragraph).
            ParagraphSeparator = 13,
            // Control code character, with a Unicode value of U+007F or in the range U+0000
            // through U+001F or U+0080 through U+009F. Signified by the Unicode designation
            // "Cc" (other, control).
            Control = 14,
            // Format character that affects the layout of text or the operation of text
            // processes, but is not normally rendered. Signified by the Unicode designation
            // "Cf" (other, format).
            Format = 15,
            // High surrogate or a low surrogate character. Surrogate code values are in
            // the range U+D800 through U+DFFF. Signified by the Unicode designation "Cs"
            // (other, surrogate).
            Surrogate = 16,
            // Private-use character, with a Unicode value in the range U+E000 through U+F8FF.
            // Signified by the Unicode designation "Co" (other, private use). 
            PrivateUse = 17,
            // Connector punctuation character that connects two characters. Signified by
            // the Unicode designation "Pc" (punctuation, connector).
            ConnectorPunctuation = 18,
            // Dash or hyphen character. Signified by the Unicode designation "Pd" (punctuation,
            // dash).
            DashPunctuation = 19,
            // Opening character of one of the paired punctuation marks, such as parentheses,
            // square brackets, and braces. Signified by the Unicode designation "Ps" (punctuation,
            // open).
            OpenPunctuation = 20,
            // Closing character of one of the paired punctuation marks, such as parentheses,
            // square brackets, and braces. Signified by the Unicode designation "Pe" (punctuation,
            // close).
            ClosePunctuation = 21,
            // Opening or initial quotation mark character. Signified by the Unicode designation
            // "Pi" (punctuation, initial quote).
            InitialQuotePunctuation = 22,
            // Closing or final quotation mark character. Signified by the Unicode designation
            // "Pf" (punctuation, final quote).
            FinalQuotePunctuation = 23,
            // Punctuation character that is not a connector, a dash, open punctuation,
            // close punctuation, an initial quote, or a final quote. Signified by the Unicode
            // designation "Po" (punctuation, other).
            OtherPunctuation = 24,
            // Mathematical symbol character, such as "+" or "= ". Signified by the Unicode
            // designation "Sm" (symbol, math).
            MathSymbol = 25,
            // Currency symbol character. Signified by the Unicode designation "Sc" (symbol,
            // currency).
            CurrencySymbol = 26,
            // Modifier symbol character, which indicates modifications of surrounding characters.
            // For example, the fraction slash indicates that the number to the left is
            // the numerator and the number to the right is the denominator. The indicator
            // is signified by the Unicode designation "Sk" (symbol, modifier).
            ModifierSymbol = 27,
            // Symbol character that is not a mathematical symbol, a currency symbol or
            // a modifier symbol. Signified by the Unicode designation "So" (symbol, other).
            OtherSymbol = 28,
            // Character that is not assigned to any Unicode category. Signified by the
            // Unicode designation "Cn" (other, not assigned). 
            OtherNotAssigned = 29
        };

        class Char
        {
        public:
            typedef Char Type;
            typedef wchar_t ValueType;
            static ValueType MinValue() { return 0; }
            static ValueType MaxValue() { return 0xFFFF; }
        private:
            ValueType value;
        public:
            Char()
                : value(0)
            {}

            Char(ValueType theValue)
                : value(theValue)
            {}

            Char(const Char& theValue)
                : value(theValue.value)
            {}

            Char& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            Char& operator = (const Char& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }


            static bool IsLatin1( ValueType ch ) 
            {
                return ch <= 0x00FF;
            }

            bool IsLatin1() const
            {
                return IsLatin1(value);
            }

            static bool IsAscii( ValueType ch ) 
            {
                return ch <= 0x007F;
            }

            bool IsAscii() const
            {
                return IsAscii(value);
            }

            static bool IsHighSurrogate(ValueType c) 
            { 
                return ((c >= HIGH_SURROGATE_START) && (c <= HIGH_SURROGATE_END));
            } 

            bool IsHighSurrogate() const
            {
                return IsHighSurrogate(value);
            }

            static bool IsLowSurrogate(ValueType c) 
            { 
                return ((c >= LOW_SURROGATE_START) && (c <= LOW_SURROGATE_END)); 
            }

            bool IsLowSurrogate() const
            {
                return IsLowSurrogate(value);
            }

            static bool IsControl(ValueType c) 
            {
                return iswcntrl(c) != 0;
            }

            bool IsControl() const
            {
                return IsControl(value);
            }

            static bool IsDigit(ValueType c) 
            {
                return iswdigit(c) != 0;
            }

            bool IsDigit() const
            {
                return IsDigit(value);
            }

            static bool IsLetter(ValueType c) 
            {
                return iswalpha(c) != 0;
            }

            bool IsLetter() const
            {
                return IsLetter(value);
            }

            static bool IsLetterOrDigit(ValueType c) 
            {
                return iswalnum(c) != 0;
            }

            bool IsLetterOrDigit() const
            {
                return IsLetterOrDigit(value);
            }

            static bool IsLower(ValueType c) 
            {
                return iswlower(c) != 0;
            }

            bool IsLower() const
            {
                return IsLower(value);
            }

            static bool IsUpper(ValueType c) 
            {
                return iswupper(c) != 0;
            }

            bool IsUpper() const
            {
                return IsUpper(value);
            }


            static bool IsPunctuation(ValueType c) 
            {
                return iswpunct(c) != 0;
            }

            bool IsPunctuation() const
            {
                return IsPunctuation(value);
            }

            static bool IsWhiteSpace(ValueType c) 
            {
                return iswspace(c) != 0;
            }

            bool IsWhiteSpace() const
            {
                return IsWhiteSpace(value);
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, Char& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, Char& result);
            HWIN_EXPORT static bool TryParse(const String& theText, Char& result);

            HWIN_EXPORT static Char Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static Char Parse(const wchar_t* theText);
            HWIN_EXPORT static Char Parse(const String& theText,size_t theTextLength);


        };

        class Boolean
        {
        public:
            typedef Boolean Type;
            typedef bool ValueType;
            static ValueType MinValue() { return false; }
            static ValueType MaxValue() { return true; }
        private:
            ValueType value;
        public:
            Boolean()
                : value(0)
            {}

            Boolean(ValueType theValue)
                : value(theValue)
            {}

            Boolean(const Boolean& theValue)
                : value(theValue.value)
            {}

            Boolean& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            Boolean& operator = (const Boolean& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, Boolean& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, Boolean& result);
            HWIN_EXPORT static bool TryParse(const String& theText, Boolean& result);

            HWIN_EXPORT static Boolean Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static Boolean Parse(const wchar_t* theText);
            HWIN_EXPORT static Boolean Parse(const String& theText,size_t theTextLength);

        };

        class Byte
        {
        public:
            typedef Byte Type;
            typedef unsigned char ValueType;
            static ValueType MinValue() { return 0; }
            static ValueType MaxValue() { return MAXBYTE; }
        private:
            ValueType value;
        public:
            Byte()
                : value(0)
            {}

            Byte(ValueType theValue)
                : value(theValue)
            {}

            Byte(const Byte& theValue)
                : value(theValue.value)
            {}

            Byte& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            Byte& operator = (const Byte& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, Byte& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, Byte& result);
            HWIN_EXPORT static bool TryParse(const String& theText, Byte& result);

            HWIN_EXPORT static Byte Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static Byte Parse(const wchar_t* theText);
            HWIN_EXPORT static Byte Parse(const String& theText,size_t theTextLength);


        };

        class SByte
        {
        public:
            typedef SByte Type;
            typedef char ValueType;
            static ValueType MinValue() { return ~MAXCHAR; }
            static ValueType MaxValue() { return MAXCHAR; }
        private:
            ValueType value;
        public:
            SByte()
                : value(0)
            {}

            SByte(ValueType theValue)
                : value(theValue)
            {}

            SByte(const SByte& theValue)
                : value(theValue.value)
            {}

            SByte& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            SByte& operator = (const SByte& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, SByte& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, SByte& result);
            HWIN_EXPORT static bool TryParse(const String& theText, SByte& result);

            HWIN_EXPORT static SByte Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static SByte Parse(const wchar_t* theText);
            HWIN_EXPORT static SByte Parse(const String& theText,size_t theTextLength);

        };

        class Int16
        {
        public:
            typedef Int16 Type;
            typedef short ValueType;
            static ValueType MinValue() { return MININT16; }
            static ValueType MaxValue() { return MAXINT16; }
        private:
            ValueType value;
        public:
            Int16()
                : value(0)
            {}

            Int16(ValueType theValue)
                : value(theValue)
            {}

            Int16(const Int16& theValue)
                : value(theValue.value)
            {}

            Int16& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            Int16& operator = (const Int16& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, Int16& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, Int16& result);
            HWIN_EXPORT static bool TryParse(const String& theText, Int16& result);

            HWIN_EXPORT static Int16 Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static Int16 Parse(const wchar_t* theText);
            HWIN_EXPORT static Int16 Parse(const String& theText,size_t theTextLength);

        };

        class UInt16
        {
        public:
            typedef UInt16 Type;
            typedef unsigned short ValueType;
            static ValueType MinValue() { return 0; }
            static ValueType MaxValue() { return MAXUINT16; }
        private:
            ValueType value;
        public:
            UInt16()
                : value(0)
            {}

            UInt16(ValueType theValue)
                : value(theValue)
            {}

            UInt16(const UInt16& theValue)
                : value(theValue.value)
            {}

            UInt16& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            UInt16& operator = (const UInt16& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, UInt16& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, UInt16& result);
            HWIN_EXPORT static bool TryParse(const String& theText, UInt16& result);

            HWIN_EXPORT static UInt16 Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static UInt16 Parse(const wchar_t* theText);
            HWIN_EXPORT static UInt16 Parse(const String& theText,size_t theTextLength);

        };


        class Int32
        {
        public:
            typedef Int32 Type;
            typedef long ValueType;
            static ValueType MinValue() { return MININT32; }
            static ValueType MaxValue() { return MAXINT32; }
        private:
            ValueType value;
        public:
            Int32()
                : value(0)
            {}

            Int32(ValueType theValue)
                : value(theValue)
            {}

            Int32(const Int32& theValue)
                : value(theValue.value)
            {}

            Int32& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            Int32& operator = (const Int32& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, Int32& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, Int32& result);
            HWIN_EXPORT static bool TryParse(const String& theText, Int32& result);

            HWIN_EXPORT static Int32 Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static Int32 Parse(const wchar_t* theText);
            HWIN_EXPORT static Int32 Parse(const String& theText,size_t theTextLength);

        };

        class UInt32
        {
        public:
            typedef UInt32 Type;
            typedef unsigned long ValueType;
            static ValueType MinValue() { return 0; }
            static ValueType MaxValue() { return MAXUINT32; }
        private:
            ValueType value;
        public:
            UInt32()
                : value(0)
            {}

            UInt32(ValueType theValue)
                : value(theValue)
            {}

            UInt32(const UInt32& theValue)
                : value(theValue.value)
            {}

            UInt32& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            UInt32& operator = (const UInt32& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, UInt32& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, UInt32& result);
            HWIN_EXPORT static bool TryParse(const String& theText, UInt32& result);

            HWIN_EXPORT static UInt32 Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static UInt32 Parse(const wchar_t* theText);
            HWIN_EXPORT static UInt32 Parse(const String& theText,size_t theTextLength);

        };


        class Int64
        {
        public:
            typedef Int64 Type;
            typedef long long ValueType;
            static ValueType MinValue() { return MININT64; }
            static ValueType MaxValue() { return MAXINT64; }
        private:
            ValueType value;
        public:
            Int64()
                : value(0)
            {}

            Int64(ValueType theValue)
                : value(theValue)
            {}

            Int64(const Int64& theValue)
                : value(theValue.value)
            {}

            Int64& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            Int64& operator = (const Int64& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, Int64& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, Int64& result);
            HWIN_EXPORT static bool TryParse(const String& theText, Int64& result);

            HWIN_EXPORT static Int64 Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static Int64 Parse(const wchar_t* theText);
            HWIN_EXPORT static Int64 Parse(const String& theText,size_t theTextLength);

        };

        class UInt64
        {
        public:
            typedef UInt64 Type;
            typedef unsigned long long ValueType;
            static ValueType MinValue() { return 0; }
            static ValueType MaxValue() { return MAXUINT64; }
        private:
            ValueType value;
        public:
            UInt64()
                : value(0)
            {}

            UInt64(ValueType theValue)
                : value(theValue)
            {}

            UInt64(const UInt64& theValue)
                : value(theValue.value)
            {}

            UInt64& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            UInt64& operator = (const UInt64& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, UInt64& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, UInt64& result);
            HWIN_EXPORT static bool TryParse(const String& theText, UInt64& result);

            HWIN_EXPORT static UInt64 Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static UInt64 Parse(const wchar_t* theText);
            HWIN_EXPORT static UInt64 Parse(const String& theText,size_t theTextLength);
        };


        class Single
        {
        public:
            typedef Single Type;
            typedef float ValueType;
            static ValueType MinValue() { return FLT_MIN; }
            static ValueType MaxValue() { return FLT_MAX; }
            static ValueType Epsilon() { return FLT_EPSILON; }
        private:
            ValueType value;
        public:
            Single()
                : value(0.0f)
            {}

            Single(ValueType theValue)
                : value(theValue)
            {}

            Single(const Single& theValue)
                : value(theValue.value)
            {}

            Single& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            Single& operator = (const Single& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, Single& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, Single& result);
            HWIN_EXPORT static bool TryParse(const String& theText, Single& result);

            HWIN_EXPORT static Single Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static Single Parse(const wchar_t* theText);
            HWIN_EXPORT static Single Parse(const String& theText,size_t theTextLength);

        };

        class Double
        {
        public:
            typedef Double Type;
            typedef double ValueType;
            static ValueType MinValue() { return DBL_MIN; }
            static ValueType MaxValue() { return DBL_MAX; }
            static ValueType Epsilon() { return DBL_EPSILON; }
        private:
            ValueType value;
        public:
            Double()
                : value(0.0)
            {}

            Double(ValueType theValue)
                : value(theValue)
            {}

            Double(const Double& theValue)
                : value(theValue.value)
            {}

            Double& operator = (ValueType theValue)
            {
                value = theValue;
                return *this;
            }

            Double& operator = (const Double& theValue)
            {
                value = theValue.value;
                return *this;
            }

            operator ValueType() const
            {
                return value;
            }

            HWIN_EXPORT static bool TryParse(const wchar_t* theText,size_t theTextLength, Double& result);
            HWIN_EXPORT static bool TryParse(const wchar_t* theText, Double& result);
            HWIN_EXPORT static bool TryParse(const String& theText, Double& result);

            HWIN_EXPORT static Double Parse(const wchar_t* theText,size_t theTextLength);
            HWIN_EXPORT static Double Parse(const wchar_t* theText);
            HWIN_EXPORT static Double Parse(const String& theText,size_t theTextLength);

        };






    };
};

#endif // __HWINTYPES_H__

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Sea Surveillance AS
Norway Norway
Chief Architect - Sea Surveillance AS.

Specializing in integrated operations and high performance computing solutions.

I’ve been fooling around with computers since the early eighties, I’ve even done work on CP/M and MP/M.

Wrote my first “real” program on a BBC micro model B based on a series in a magazine at that time. It was fun and I got hooked on this thing called programming ...

A few Highlights:

  • High performance application server development
  • Model Driven Architecture and Code generators
  • Real-Time Distributed Solutions
  • C, C++, C#, Java, TSQL, PL/SQL, Delphi, ActionScript, Perl, Rexx
  • Microsoft SQL Server, Oracle RDBMS, IBM DB2, PostGreSQL
  • AMQP, Apache qpid, RabbitMQ, Microsoft Message Queuing, IBM WebSphereMQ, Oracle TuxidoMQ
  • Oracle WebLogic, IBM WebSphere
  • Corba, COM, DCE, WCF
  • AspenTech InfoPlus.21(IP21), OsiSoft PI


More information about what I do for a living can be found at: harlinn.com or LinkedIn

You can contact me at espen@harlinn.no

Comments and Discussions