+#ifdef __cplusplus
+
+U_NAMESPACE_BEGIN
+
+/**
+ * \class StackUResourceBundle
+ * "Smart pointer" like class, closes a UResourceBundle via ures_close().
+ *
+ * This code:
+ *
+ * StackUResourceBundle bundle;
+ * foo(bundle.getAlias());
+ *
+ * Is equivalent to this code:
+ *
+ * UResourceBundle bundle;
+ * ures_initStackObject(&bundle);
+ * foo(&bundle);
+ * ures_close(&bundle);
+ *
+ * @see LocalUResourceBundlePointer
+ * @internal
+ */
+class U_COMMON_API StackUResourceBundle {
+public:
+ // No heap allocation. Use only on the stack.
+ static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete;
+ static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete;
+#if U_HAVE_PLACEMENT_NEW
+ static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete;
+#endif
+
+ StackUResourceBundle();
+ ~StackUResourceBundle();
+
+ UResourceBundle* getAlias() { return &bundle; }
+
+ UResourceBundle& ref() { return bundle; }
+ const UResourceBundle& ref() const { return bundle; }
+
+ StackUResourceBundle(const StackUResourceBundle&) = delete;
+ StackUResourceBundle& operator=(const StackUResourceBundle&) = delete;
+
+ StackUResourceBundle(StackUResourceBundle&&) = delete;
+ StackUResourceBundle& operator=(StackUResourceBundle&&) = delete;
+
+private:
+ UResourceBundle bundle;
+};
+
+U_NAMESPACE_END
+
+#endif /* __cplusplus */
+