blob: 221f86c25eddd68c058cb5e1161c1119cf0ddb89 [file] [log] [blame] [edit]
/*****************************************************************************/
// Copyright 2006-2020 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in
// accordance with the terms of the Adobe license agreement accompanying it.
/*****************************************************************************/
/** \file
* Text string representation.
*/
/*****************************************************************************/
#ifndef __dng_string__
#define __dng_string__
/*****************************************************************************/
#include "dng_types.h"
#include "dng_memory.h"
#include <memory>
#include <string>
#include <unordered_set>
/*****************************************************************************/
typedef std::basic_string<char,
std::char_traits<char>,
dng_std_allocator<char>> dng_std_string;
/*****************************************************************************/
class dng_string
{
private:
// Strings are always stored using UTF-8 encoding. Shared pointers
// are used to provide copy-on-write optimizations. Null strings
// are always encoded as a null shared pointer (not pointer to a
// null string).
std::shared_ptr<const dng_std_string> fData;
public:
dng_string ();
dng_string (const dng_string &s);
dng_string (const char *s);
dng_string & operator= (const dng_string &s);
~dng_string ();
const char * Get () const;
bool IsASCII () const;
void Set (const char *s);
void Set_ASCII (const char *s);
void Set_UTF8 (const char *s);
uint32 Get_SystemEncoding (dng_memory_data &buffer) const;
void Set_SystemEncoding (const char *s);
bool ValidSystemEncoding () const;
void Set_JIS_X208_1990 (const char *s);
static uint32 DecodeUTF8 (const char *&s,
uint32 maxBytes = 6,
bool *isValid = NULL);
static bool IsUTF8 (const char *s);
void Set_UTF8_or_System (const char *s);
uint32 Get_UTF16 (dng_memory_data &buffer) const;
void Set_UTF16 (const uint16 *s);
void Clear ();
void Truncate (uint32 maxBytes);
bool TrimTrailingBlanks ();
bool TrimLeadingBlanks ();
bool IsEmpty () const;
bool NotEmpty () const
{
return !IsEmpty ();
}
uint32 Length () const;
bool operator== (const dng_string &s) const;
bool operator!= (const dng_string &s) const
{
return !(*this == s);
}
// A utility for doing case insensitive comparisons on strings...
static bool Matches (const char *t,
const char *s,
bool case_sensitive = false);
// ...wrapped up for use with dng_string.
bool Matches (const char *s,
bool case_sensitive = false) const;
bool StartsWith (const char *s,
bool case_sensitive = false) const;
bool EndsWith (const char *s,
bool case_sensitive = false) const;
bool Contains (const char *s,
bool case_sensitive = false,
int32 *match_offset = NULL) const;
bool Replace (const char *old_string,
const char *new_string,
bool case_sensitive = true);
void ReplaceChars (char oldChar,
char newChar);
bool TrimLeading (const char *s,
bool case_sensitive = false);
void Append (const char *s);
void SetUppercase ();
void SetLowercase ();
void SetLineEndings (char ending);
void SetLineEndingsToNewLines ()
{
SetLineEndings ('\n');
}
void SetLineEndingsToReturns ()
{
SetLineEndings ('\r');
}
void StripLowASCII ();
void ForceASCII ();
int32 Compare (const dng_string &s,
bool digitsAsNumber = true) const;
// A utility to convert fields of numbers into comma separated numbers.
void NormalizeAsCommaSeparatedNumbers ();
};
/*****************************************************************************/
class dng_string_hash
{
public:
size_t operator () (const dng_string &s) const;
};
/*****************************************************************************/
typedef std::unordered_set<dng_string,
dng_string_hash> dng_string_table;
/*****************************************************************************/
#endif // __dng_string__
/*****************************************************************************/