Adobe.com
Contents Suites Classes Class Index Member Index

IAICharacterEncoding.h

Go to the documentation of this file.
00001 #ifndef _IAICHARACTERENCODING_H_
00002 #define _IAICHARACTERENCODING_H_
00003 
00004 /*
00005  *        Name: IAICharacterEncoding.h
00006  *     Purpose: 
00007  *
00008  * ADOBE SYSTEMS INCORPORATED
00009  * Copyright 2005-2007 Adobe Systems Incorporated.
00010  * All rights reserved.
00011  *
00012  * NOTICE:  Adobe permits you to use, modify, and distribute this file 
00013  * in accordance with the terms of the Adobe license agreement 
00014  * accompanying it. If you have received this file from a source other 
00015  * than Adobe, then your use, modification, or distribution of it 
00016  * requires the prior written permission of Adobe.
00017  *
00018  */
00019 
00020 #include <string>
00021 #include <vector>
00022 #include "AICharacterEncoding.h"
00023 
00024 //needed for one of the templates below.
00025 extern "C" AICharacterEncodingSuite *sAICharacterEncoding;
00026 
00027 namespace ai {
00028 
00030 struct PlatformTraits {
00032         typedef char unit_type;
00035         static AICharacterEncoding encoding ()
00036                 {return kAIPlatformCharacterEncoding;}
00042         static size_t codes_2_units (size_t codes)
00043                 {return codes * 2;}
00049         static size_t units_2_codes (size_t units)
00050                 {return units;}
00051 };
00052 
00054 struct UTF8Traits {
00056         typedef char unit_type;
00059         static AICharacterEncoding encoding ()
00060                 {return kAIUTF8CharacterEncoding;}
00066         static size_t codes_2_units (size_t codes)
00067                 {return codes * 4;}
00073         static size_t units_2_codes (size_t units)
00074                 {return units;}
00075 };
00076 
00078 struct UTF16Traits {
00080         typedef ASUnicode unit_type;
00083         static AICharacterEncoding encoding ()
00084                 {return kAIUTF16CharacterEncoding;}
00090         static size_t codes_2_units (size_t codes)
00091                 {return codes * 2;}
00097         static size_t units_2_codes (size_t units)
00098                 {return units;}
00099 };
00100 
00101 // Template class for encoded strings
00102 
00104 template <class Traits>
00105 class EncodedString {
00106 public:
00110         EncodedString ()
00111         {}
00112 
00117         EncodedString (const EncodedString& s) :
00118                 string(s.string)
00119         {}
00120 
00125         explicit EncodedString (const std::basic_string<typename Traits::unit_type>& s) :
00126                 string(s)
00127         {}
00128 
00134         explicit EncodedString (const typename Traits::unit_type* s) :
00135                 string(s)
00136         {}
00137         // construct an encoded string from a buffer containing elements
00138         // of the same encoding
00145         EncodedString (const typename Traits::unit_type* s, size_t length) :
00146                 string(s, length)
00147         {}
00148 
00150         EncodedString& operator= (const EncodedString& s)
00151         {
00152                 string = s.string;
00153                 return *this;
00154         }
00155 
00156 #if 1
00157 
00158         // for some reason Windows can't handle a templated conversion operator,
00159         // so we define an explicit cast operator instead.
00160         template <class SrcTraits>
00161         static EncodedString<Traits> cast (const EncodedString<SrcTraits>& src)
00162         {
00163                 EncodedString<Traits> dst;
00164 
00165                 size_t maxsize = Traits::codes_2_units(SrcTraits::units_2_codes(src.string.size()));
00166                 size_t maxbytes = maxsize * sizeof(typename Traits::unit_type);
00167                 std::vector<typename Traits::unit_type> b(maxsize);
00168 
00169                 size_t bytes;
00170                 size_t size;
00171                 AIErr result = sAICharacterEncoding->ConvertBuffer(
00172                                 src.string.data(),
00173                                 src.string.size() * sizeof(typename SrcTraits::unit_type),
00174                                 SrcTraits::encoding(),
00175                                 &b[0], maxbytes, Traits::encoding(),
00176                                 &bytes, FALSE);
00177                 if (result)
00178                         throw ai::Error(result);
00179                 size = bytes / sizeof(typename Traits::unit_type);
00180 
00181                 dst = EncodedString<Traits>(&b[0], size);
00182 
00183                 return dst;
00184         }
00185 #else
00186         // implicit conversion to another encoding
00187         template <class DstTraits>
00188         operator EncodedString<DstTraits> () const
00189         {
00190                 EncodedString<DstTraits> dst;
00191 
00192                 size_t maxsize = DstTraits::codes_2_units(Traits::units_2_codes(string.size()));
00193                 size_t maxbytes = maxsize * sizeof(DstTraits::unit_type);
00194                 std::vector<DstTraits::unit_type> b(maxsize);
00195 
00196                 size_t bytes;
00197                 size_t size;
00198                 AIErr result = sAICharacterEncoding->ConvertBuffer(
00199                                 string.data(), string.size(), Traits::encoding(),
00200                                 b, maxbytes, DstTraits::encoding(),
00201                                 &bytes, FALSE);
00202                 if (result)
00203                         throw ai::Error(result);
00204                 size = bytes / sizeof(DstTraits::unit_type);
00205 
00206                 dst = EncodedString<DstTraits>(b, size);
00207 
00208                 return dst;
00209         }
00210 #endif
00211 
00212         // the encoded data. direct access is allowed.
00213         std::basic_string<typename Traits::unit_type> string;
00214 };
00215 
00216 
00217 // types for strings
00219 typedef EncodedString<PlatformTraits> PlatformString;
00221 typedef EncodedString<UTF8Traits> UTF8String;
00223 typedef EncodedString<UTF16Traits> UTF16String;
00224 
00225 
00226 }
00227 
00228 #endif


Contents Suites Classes Class Index Member Index
Adobe Solutions Network
 
Copyright © 2016 Adobe Systems Incorporated. All rights reserved.
Terms of Use Online Privacy Policy Adobe and accessibility Avoid software piracy Permissions and Trademarks