@@ -102,6 +102,60 @@ inline void remove_first(std::string& input,
102102 }
103103}
104104
105+ /* *
106+ * Replaces the first occurrence of a substring in a string in place.
107+ *
108+ * @param input string to modify
109+ * @param substring substring to replace
110+ * @param replacement replacement string
111+ */
112+ inline void replace_first (std::string& input,
113+ const std::string_view& substring,
114+ const std::string_view& replacement) {
115+ const std::size_t position = input.find (substring);
116+ if (position != std::string::npos) {
117+ input.replace (position, substring.size (), replacement);
118+ }
119+ }
120+
121+ /* *
122+ * Tests whether a string contains a substring.
123+ *
124+ * @param input string to test
125+ * @param substring substring to look for
126+ * @return true if input contains substring
127+ */
128+ inline bool contains (const std::string_view& input,
129+ const std::string_view& substring) {
130+ return input.find (substring) != std::string_view::npos;
131+ }
132+
133+ /* *
134+ * Tests whether a string ends with a suffix.
135+ *
136+ * @param input string to test
137+ * @param suffix suffix to look for
138+ * @return true if input ends with suffix
139+ */
140+ inline bool ends_with (const std::string_view& input,
141+ const std::string_view& suffix) {
142+ return input.size () >= suffix.size ()
143+ && input.substr (input.size () - suffix.size ()) == suffix;
144+ }
145+
146+ /* *
147+ * Tests whether a string starts with a prefix.
148+ *
149+ * @param input string to test
150+ * @param prefix prefix to look for
151+ * @return true if input starts with prefix
152+ */
153+ inline bool starts_with (const std::string_view& input,
154+ const std::string_view& prefix) {
155+ return input.size () >= prefix.size ()
156+ && input.substr (0 , prefix.size ()) == prefix;
157+ }
158+
105159} // namespace io
106160} // namespace stan
107161
0 commit comments