10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger/*
4e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger******************************************************************************
5e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger*
664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert*   Copyright (C) 2016, International Business Machines
7e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger*   Corporation and others.  All Rights Reserved.
8e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger*
9e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger******************************************************************************
10e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger*
11e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger* File: cstr.h
12e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger*/
13e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger
14e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger#ifndef CSTR_H
15e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger#define CSTR_H
16e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger
17e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger#include "unicode/unistr.h"
18e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger#include "unicode/uobject.h"
19e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger#include "unicode/utypes.h"
20e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger
21e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger#include "charstr.h"
22e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger
23e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger/**
2464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert * ICU-internal class CStr, a small helper class to facilitate passing UnicodeStrings
25e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger * to functions needing (const char *) strings, such as printf().
26e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger *
27e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger * It is intended primarily for use in debugging or in tests. Uses platform
28e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger * default code page conversion, which will do the best job possible,
29e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger * but may be lossy, depending on the platform.
30e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger *
3164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert * If no other conversion is available, use invariant conversion and substitue
3264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert * '?' for non-invariant characters.
3364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert *
34e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger * Example Usage:
35e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger *   UnicodeString s = whatever;
36e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger *   printf("%s", CStr(s)());
37e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger *
38e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger *   The explicit call to the CStr() constructor creates a temporary object.
39e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger *   Operator () on the temporary object returns a (const char *) pointer.
40e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger *   The lifetime of the (const char *) data is that of the temporary object,
41e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger *   which works well when passing it as a parameter to another function, such as printf.
42e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger */
43e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger
44e8dd0ddd72048a9097be7a46a47e58068ec84055Andy HeningerU_NAMESPACE_BEGIN
45e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger
46e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heningerclass U_COMMON_API CStr : public UMemory {
47e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger  public:
48e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger    CStr(const UnicodeString &in);
49e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger    ~CStr();
50e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger    const char * operator ()() const;
51e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger
52e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger  private:
53e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger    CharString s;
54e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger    CStr(const CStr &other);               //  Forbid copying of this class.
55e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger    CStr &operator =(const CStr &other);   //  Forbid assignment.
56e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger};
57e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger
58e8dd0ddd72048a9097be7a46a47e58068ec84055Andy HeningerU_NAMESPACE_END
59e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger
60e8dd0ddd72048a9097be7a46a47e58068ec84055Andy Heninger#endif
61