1 /*
2 	SObjectizer 5.
3 */
4 
5 /*!
6 	\file
7 	\brief A nonempty_name class definition.
8 */
9 
10 #pragma once
11 
12 #include <string>
13 
14 #include <so_5/ret_code.hpp>
15 #include <so_5/exception.hpp>
16 
17 namespace so_5
18 {
19 
20 //
21 // nonempty_name_t
22 //
23 
24 //! A class for the name which cannot be empty.
25 /*!
26  * Checks value in the constructor. Throws an exception if the name is empty.
27 */
28 class nonempty_name_t
29 {
30 		// Note: clang-3.9 requires this on Windows platform.
31 		nonempty_name_t( const nonempty_name_t & ) = delete;
32 		nonempty_name_t & operator=( const nonempty_name_t & ) = delete;
33 
34 	public:
35 		//! Constructor with check for the empty value.
nonempty_name_t(const char * name)36 		nonempty_name_t( const char * name )
37 			:	nonempty_name_t( std::string(name) )
38 		{}
39 
40 		//! Constructor with check for the empty value.
nonempty_name_t(std::string name)41 		nonempty_name_t( std::string name )
42 			:	m_nonempty_name( std::move(name) )
43 		{
44 			if( m_nonempty_name.empty() )
45 				SO_5_THROW_EXCEPTION( rc_empty_name, "empty string as argument" );
46 		}
47 
nonempty_name_t(nonempty_name_t && o)48 		nonempty_name_t( nonempty_name_t && o )
49 			:	m_nonempty_name( std::move(o.m_nonempty_name) )
50 		{}
51 
swap(nonempty_name_t & a,nonempty_name_t & b)52 		friend void swap( nonempty_name_t & a, nonempty_name_t & b )
53 		{
54 			a.m_nonempty_name.swap( b.m_nonempty_name );
55 		}
56 
operator =(nonempty_name_t && o)57 		nonempty_name_t & operator=( nonempty_name_t && o )
58 		{
59 			nonempty_name_t tmp( std::move(o) );
60 			swap( *this, o );
61 			return *this;
62 		}
63 
64 		//! Get the value.
65 		inline const std::string &
query_name() const66 		query_name() const
67 		{
68 			return m_nonempty_name;
69 		}
70 
71 		/*!
72 		 * \brief Get the value away from the object.
73 		 *
74 		 * \attention
75 		 * After calling that method m_nonempty_name will become empty!
76 		 *
77 		 * \since
78 		 * v.5.5.19
79 		 */
80 		std::string
giveout_value()81 		giveout_value()
82 		{
83 			std::string r;
84 			r.swap( m_nonempty_name );
85 			return r;
86 		}
87 
88 	private:
89 		//! Value.
90 		std::string m_nonempty_name;
91 };
92 
93 } /* namespace so_5 */
94 
95